У меня есть этот столбец целых, которые представляют возникновение сигнала, и я пытаюсь добавить столбец, который показывает количество последовательных строк
Если мои данные выглядят так
724
727
728
733
735
737
743
747
749
результирующие данные с последовательным столбцом подсчета строк будут выглядеть следующим образом
724 1
727 1
728 2
729 3
735 1
737 1
743 1
744 2
748 1
Я сделал это с помощью функции зацикливания, но я пытаюсь выяснить, используя cte. Вот образец моей последней попытки
DECLARE @d TABLE ( signal INT )
INSERT INTO @d
SELECT 724
UNION
SELECT 727
UNION
SELECT 728
UNION
SELECT 729
UNION
SELECT 735
UNION
SELECT 737
UNION
SELECT 743
UNION
SELECT 744
UNION
SELECT 748 ;
WITH a AS ( SELECT signal,
ROW_NUMBER() OVER ( ORDER BY signal ) AS marker
FROM @d
) ,
b AS ( SELECT a1.signal,
CASE ( a1.signal - a2.signal )
WHEN 1 THEN 1
ELSE 0
END consecutiveMarker
FROM a a1
INNER JOIN a a2 ON a2.marker = a1.marker - 1
)
SELECT *
FROM b
Производит эти результаты
signal consecutiveMarker
727 0
728 1
729 1
735 0
737 0
743 0
744 1
748 0
Первая очевидная проблема - отсутствие первого сигнала в серии. За исключением этого, я подумал, что смогу затем передать это другому cte с разделением row_number на последовательном маркере. Это не сработало, потому что разделило его на один раздел. Я не смог найти способ указать методу разделения, что одна серия отделена от следующей
Любая помощь приветствуется.
источник
Ответы:
Общее название для этого типа запроса "пробелы и острова". Один подход ниже. Если у вас могут быть дубликаты в исходных данных, которые вам могут понадобиться,
dense_rank
а неrow_number
Возвращает
источник
В SQL 2012 вы также можете сделать это, используя LAG и оконные функции, например
источник
Как обычно с такими проблемами, это очень легко сделать в Java или C ++ или C #.
Если вам действительно нужно сделать это в базе данных, вы можете использовать СУБД с быстрыми курсорами, такими как Oracle, написать простой курсор и наслаждаться быстрой производительностью без необходимости писать что-либо сложное.
Если вам нужно сделать это в T-SQL, и вы не можете изменить дизайн базы данных, Ицик Бен-Ган написал несколько решений в «MVP Deep Dives vol 1», а также несколько новых решений, использующих функции OLAP, в своей новой книге о оконных функциях в SQL 2012
Кроме того, вы можете добавить в таблицу еще один столбец последовательный маркер и сохранить в нем предварительно рассчитанные значения. Мы можем использовать ограничения, чтобы гарантировать, что предварительно рассчитанные данные всегда действительны. Если кому-то интересно, могу объяснить как.
источник