Создание одной записи для непрерывной последовательности дат в новой таблице - PullRequest
0 голосов
/ 04 июня 2019

У нас есть таблица в Microsoft SQL Server 2014, как показано ниже, в которой есть столбцы Id, LogId, AccountId, StateCode, Number и LastSentDate.

enter image description here

Нашей целью было перенести данные в новую таблицу.Когда мы его перемещаем, нам нужно поддерживать первую и последнюю запись для этой серии.На основании наших данных lastsentdate начинается с 5/1 и продолжается до 5/5, затем мы должны создать новую строку, как показано ниже (мы устанавливаем FirstSentDate как 5/1, Log Id в качестве первого идентификатора журнала, который появился - 28369 и с тех порсерия закончилась 5/5, мы обновляем LastsentDate как 5/5 и LastSentLog Id как 28752)

enter image description here

, если есть некоторые даты с разницей ввремя, желаемый результат будет

enter image description here

Поскольку наш ряд дат продолжается, последняя строка в новой таблице будет

enter image description here

Мы пытались сгруппировать по дате и добиться этого

WITH t
     AS (SELECT LastSentDate d, 
                ROW_NUMBER() OVER(
                ORDER BY LastSentDate) i
         FROM [dbo].[RegistrationActivity]
         GROUP BY LastSentDate)
     SELECT MIN(d), 
            MAX(d)
     FROM t
     GROUP BY DATEDIFF(day, i, d);

1 Ответ

1 голос
/ 04 июня 2019

Используйте lag(), чтобы определить, где начинается группа.Затем используйте накопленную сумму, чтобы назначить идентификатор группы для каждой группы.И, наконец, извлеките нужные вам данные.Я не уверен, какие данные вы на самом деле хотите, но вот идея:

select accountid, min(lastsentdate), max(lastsentdate)
from (select t.*,
             sum(case when prev_lsd > dateadd(day, 1, lastsentdate )then 0 else 1 end) over (partition by accountid order by lastsentdate) as grp
      from (select t.*, lag(lastsentdate) over (partition by accountid) as prev_lsd
            from t
           ) t
     ) t
group by accountid;
...