数据库
首页 > 数据库> > mysql – 运行长度或连续相同值编码的SQL查询

mysql – 运行长度或连续相同值编码的SQL查询

作者:互联网

我的目标是获取一组按id排序的数据,并返回一个结果集,该结果集指示val列相同的连续行数.例如.鉴于此数据:

| id | val |
|  1 |  33 |
|  2 |  33 |
|  3 |  44 |
|  4 |  28 |
|  5 |  44 |
|  6 |  44 |

我想看到这个结果:

| id | val | run_length |
| 1  | 33  | 2          |
| 3  | 44  | 1          |
| 4  | 28  | 1          |
| 5  | 44  | 2          |

结果集中的id列是可选的.事实上,如果它使它变得更加困难,那么只需将该列留在结果之外.我有点喜欢它,因为它将结果集“固定”到表中的特定位置.

我主要对免费数据库引擎的结果感兴趣.我对解决方案的偏好顺序是:

> SQLite
> Postgres
> MySQL
>甲骨文
> SQL Server
> Sybase

解决方法:

我会在你的列表中选择#2,因为使用单个查询在SQLite中这是非常痛苦的.以下是标准SQL:

select min(id), val, count(*) as runlength
from (select t.*,
             (row_number() over (order by id) -
              row_number() over (partition by val order by id
             ) as grp
      from data t
     ) t
group by grp, val;

这使用两个行数计算的差异来识别相同值的相关性.它应该适用于最新版本的数据库2,4,5和6.

标签:mysql,sql,sqlite,postgresql,gaps-and-islands
来源: https://codeday.me/bug/20190628/1316594.html