我有一个格式如下的表格:
cId seq
--- ---
A 1
A 2
A 4
A 5
B 8
B 9
A 12
A 13
我想编写一个查询来生成另一个如下所示的表:
cId seq consecutive
--- --- -----------
A 1 1
A 2 1
A 4 2
A 5 2
B 8 3
B 9 3
A 12 4
A 13 4
我想做的是识别具有相同 cId 的连续 seq 值,然后对它们进行编号。
我想用Lag函数确定前一个seq值,然后设置连续的列,但不知道遇到下一个break时如何增加值。
SELECT [cId],
[Seq],
CASE WHEN [Seq] - 1 = LAG([Seq], 1, [Seq]) OVER ( ORDER BY [Seq]) THEN 1
ELSE 2 END as consecutive
FROM #ConsecutiveData
此查询将在每个序列的开头旁边放置一个 2。这是我最接近的。
最佳答案
我认为作者没有使用 MySQL,因为据我所知,MySQL 中没有 LAG
函数。
以下是 MSSQL 的可能解决方案:
SELECT
cid,
seq,
DENSE_RANK() OVER (ORDER BY seq - row_num) consecutive
FROM (
SELECT
cid,
seq,
ROW_NUMBER() OVER (ORDER BY seq) row_num
FROM
test_table
) data
;
检查 SQLFiddle: SQLFiddle Example
关于mysql - 识别连续的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19824509/