2013-11-06 2 views
0

У меня есть таблица в следующем формате:Определение последовательных строк

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 

То, что я пытаюсь do - это идентификаторы последовательных значений seq, которые имеют одинаковый cId, а затем их число.

Я думал об использовании функции 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

Вы используете '' MySQL' или Microsoft SQL'? –

ответ

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

Смежные вопросы