Ter*_*non 6 mysql sql sqlite postgresql gaps-and-islands
我的目标是获取一组按顺序排序的数据,id
并返回一个结果集,该结果集指示该val
列相同的连续行数。例如,给出以下数据:
| id | val |
| 1 | 33 |
| 2 | 33 |
| 3 | 44 |
| 4 | 28 |
| 5 | 44 |
| 6 | 44 |
Run Code Online (Sandbox Code Playgroud)
我希望看到这个结果:
| id | val | run_length |
| 1 | 33 | 2 |
| 3 | 44 | 1 |
| 4 | 28 | 1 |
| 5 | 44 | 2 |
Run Code Online (Sandbox Code Playgroud)
结果集中的id列是可选的。实际上,如果这使难度大大增加,则只需将该列放在结果之外。我有点喜欢它,因为它可以将结果集“固定”到表中的特定位置。
我主要对免费数据库引擎的结果感兴趣。我对解决方案的偏好顺序是:
我将在列表上选择#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;
Run Code Online (Sandbox Code Playgroud)
这使用两个行号计算的差值来识别相同值的序列。它应该可以在数据库2、4、5和6的最新版本中使用。
归档时间: |
|
查看次数: |
585 次 |
最近记录: |