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