Связывание временных точек SQL Server на основе значения

У меня есть данные аудита, собранные в разные моменты времени, которые я хотел бы агрегировать, чтобы отобразить, где значение было одинаковым в течение определенного периода времени с использованием SQL Server 2014.

Взяв приведенный ниже пример данных

введите здесь описание изображения

Я хотел бы идеально перенести его на это без использования курсора - вы увидите, что вывод записывает период времени, когда значение одинаково, и поэтому одно и то же значение может повторяться в разные периоды (видно в строках 3 и 6).

введите здесь описание изображения

Я рассматривал LEAD() и LAG() как возможные решения, однако я не могу понять, как заставить это работать, чтобы сгруппировать по времени для одного и того же значения.

Любое направление будет с благодарностью получено


person Mark Ruse    schedule 26.04.2017    source источник
comment
Итак, вы ищете группы value, которые одинаковы, но только в виде непрерывных блоков в отношении увеличения времени? Если так, то это своего рода пробелы и островки проблем.   -  person Tim Biegeleisen    schedule 26.04.2017
comment
Вы должны показать образцы данных, которые проясняют это требование. Ваши текущие данные приводят к простому запросу GROUP BY, а это не то, что вам нужно.   -  person Tim Biegeleisen    schedule 26.04.2017
comment
точно - вы можете видеть, что в выходной строке 3 и 6 имеют одинаковое значение, но произошли в разном временном диапазоне. Короче говоря, я пытаюсь преобразовать этот дискретный поток данных в более непрерывную структуру, чтобы облегчить выполнение запросов.   -  person Mark Ruse    schedule 26.04.2017
comment
Отредактировал вопрос, чтобы, надеюсь, сделать требование более ясным   -  person Mark Ruse    schedule 26.04.2017


Ответы (2)


Если столбец [значение] не содержит отдельного числа, вы можете использовать этот запрос

 SELECT start,end,value 
 FROM (SELECT MIN(ts) start
             ,MAX(ts) end
             ,value
             ,C 
       FROM (SELECT ts
                   ,value
                   ,(ROW_NUMBER() OVER (ORDER BY ts) 
                    - ROW_NUMBER() OVER (PARTITION BY value ORDER BY ts)) C
             FROM YourTable) x
 GROUP BY value,C) y ORDER BY start
person ridwanrohman95    schedule 26.04.2017
comment
Отлично - это именно то, что мне нужно, и работает отлично - спасибо - person Mark Ruse; 26.04.2017
comment
Это действительно отличный ответ, о котором следует помнить. Вот ссылка на демонстрацию, показывающую запрос в действии. Оно работает. - person Tim Biegeleisen; 27.04.2017

Увидев ваши дальнейшие комментарии, ниже, очевидно, бесполезно...

Я думаю, вы, возможно, слишком усложняете это. Если вы ищете минимальное и максимальное значение ts для каждого отдельного значения, вы можете просто использовать MIN и MAX и сгруппировать по значению, например.

SELECT   MIN(ts) AS [Start]  ,
         MAX(ts) AS [End]    , 
         Value
FROM     Table
GROUP BY Value
person Keith    schedule 26.04.2017