SQL查询游程长度或连续的相同值编码

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列是可选的。实际上,如果这使难度大大增加,则只需将该列放在结果之外。我有点喜欢它,因为它可以将结果集“固定”到表中的特定位置。

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

  1. SQLite的
  2. Postgres
  3. 的MySQL
  4. 甲骨文
  5. SQL服务器
  6. Sybase公司

Gor*_*off 6

我将在列表上选择#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的最新版本中使用。