Объединять строки, когда значение не изменяется в непрерывном времени - PullRequest
1 голос
/ 26 февраля 2020

Мне нужно суммировать таблицу, содержащую эту информацию: серийный номер, StartDate, EndDate, StatusID и TimeInState, мне нужно объединить строки, которые сохраняют один и тот же StatusId в течение непрерывного времени (EndDate строки совпадает с StartDate of другой), например, для этого случая:

Dataset

Мне нужно вывести это:

Desired Output Table

Я не могу прийти с решением еще, так как я думаю, что я не могу использовать Group By, мне нужно объединить строки с указанным c SerialNumber, когда StatusId не изменяется в непрерывном времени.

1 Ответ

0 голосов
/ 26 февраля 2020

Это типичная проблема пробелов и островков, когда вы хотите сгруппировать смежные строки, имеющие одинаковый серийный номер и статус.

Вот стандартный подход, который использует разницу между row_number s определить группы:

select
    serialNumber,
    min(beginDateTime) beginDateTime,
    max(endDateTime) endDateTime,
    statusId,
    sum(timeInStateInMilliseconds) timeInStateInMilliseconds
from (
    select 
        t.*,
        row_number() over(partition by serialNumber order by beginDateTime) rn1,
        row_number() over(partition by serialNumber , statusId order by beginDateTime) rn2
    from mytable t
) t
group by serialNumber, statusId, rn1 - rn2
...