如何根据sql查询结果中的顺序枚举连续的行组

Nik*_*ikT 2 sql sql-server ssms

我正在尝试获取类似于下面的desired_output列的列,并尝试过像DENSE_RANK和ROW_NUMBER这样的函数,但似乎无法在此处获得正确的组合.我没有关键来确定连续组之间的"过渡" .

因此,每次每个id_key命中一个新组时,无论它是否已经按照该组击中(按顺序排序),我都想开始一个新的"过渡"

最终目标是获得每个desired_output的MIN和MAX 序列,我将使用GROUP BY.我能够使用LEAD/LAG/JOINS的复杂查询来完成此任务,但是想知道是否有人知道类似DENSE_RANK的函数(或者使用DENSE_RANK的方法),它将给出下面的desired_output(绘制完整图片) .

谢谢 !

id_key      sequence    group       desired_output          
1           1           A           1
1           2           A           1
1           3           B           2
1           4           B           2
1           5           B           2
1           6           B           2
1           7           C           3
1           8           C           3
1           9           C           3
1           10          B           4
1           11          B           4
1           12          B           4
1           13          C           5
1           14          C           5
2           15          A           1
2           16          A           1
2           17          B           2
2           18          B           2
2           19          C           3
2           20          C           3
2           21          B           4
2           22          C           5
2           23          C           5
2           24          C           5
Run Code Online (Sandbox Code Playgroud)

Gio*_*sos 7

试试这个:

SELECT id_key, sequence, [group],
       SUM(flag) OVER (PARTITION BY id_key 
                       ORDER BY sequence) + 1 AS desired_output
FROM (
  SELECT id_key, sequence, [group],
         IIF(LAG([group]) OVER (PARTITION BY id_key 
                                ORDER BY sequence) <> [group], 1, 0) AS flag
  FROM mytable) AS t
ORDER BY sequence
Run Code Online (Sandbox Code Playgroud)

flag字段标记[group]每个id_key分区中列的任何更改.外部查询使用flag字段来计算运行总计,以便考虑[group]每个id_key分区中的所有更改.