ищите записи с последовательными датами и знайте количество дней

#tsql

Вопрос:

У меня есть таблица, содержащая поля:

 cazi, cdip, date

1 2 13/03/2021
1 2 14/03/2021
1 2 15/03/2021
1 2 18/03/2021
1 2 19/03/2021
1 3 13/03/2021
1 3 14/03/2021
1 3 15/03/2021
1 3 20/03/2021
1 3 21/03/2021
 

Я не могу получить результат с помощью столбцов:

 cazi, cdip, date1, date2, num_dd

1 2 13/03/2021 15/03/2021 3
1 2 18/03/2021 19/03/2021 2
1 3 13/03/2021 15/03/2021 3
1 3 20/03/2021 21/03/2021 2
 

Вы не могли бы мне помочь?

С помощью следующего кода я получаю минимальное и максимальное количество записей, но мне нужны последовательные записи:

 WITH
dateGroup AS
(  
SELECT DISTINCT
       UniqueDate = [date]
      ,DateGroup  = DATEADD(dd, - ROW_NUMBER() OVER (ORDER BY [date]), [date])
FROM malt
GROUP BY [date]
)

SELECT distinct
     StartDate = MIN(UniqueDate)
    ,EndDate   = MAX(UniqueDate)
    ,Days      = DATEDIFF(dd,MIN(UniqueDate),MAX(UniqueDate)) 1
    ,cazi
              ,cdip
FROM dateGroup JOIN 
     malt u ON u.date = UniqueDate


GROUP BY 
DateGroup
,cazi
,cdip
 

Комментарии:

1. Для начала было бы неплохо объяснить логику. Ваши попытки тоже были бы полезны.

2. лаурн я вставил код

3. Объяснение все еще необходимо «ноэторджану».

4. для каждой записи cazi, cdip, даты мне нужна запись: от / до, только если последовательно

Ответ №1:

Это традиционная проблема ПРОБЕЛОВ и ОСТРОВОВ. Вы можете попробовать выполнить приведенный ниже запрос, чтобы достичь желаемого результата —

 SELECT cazi, cdip, MIN(T.[date]), MAX(T.[date])
  FROM (SELECT M.*, ROW_NUMBER() OVER(PARTITION BY cdip ORDER BY [date]) RN
          FROM malt M) T
 GROUP BY cazi, cdip, DATEADD(DAY, - RN, [date]);
 

ДЕМОНСТРАЦИЯ.

Комментарии:

1. большое спасибо, это работает!

2. Поздравление. Счастливого кодирования.