我有一个表格格式如下:
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值,然后设置连续列,但在遇到下一个中断时不知道如何递增值。
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。那是我最接近的。
答案 0 :(得分:3)
我认为作者没有使用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