Я бы так и сделал, используя LEAD
.Вы можете использовать LEAD
, чтобы проверить, имеет ли следующий StartDate
то же значение, что и текущий EndDate
.Если он возвращает 0, а если нет 1, и при условии, что SUM
из этих значений равно 0, мы знаем, что все даты были непрерывными:
WITH CTE AS(
SELECT ID,
StartDate,
EndDate,
CASE LEAD(StartDate,1, EndDate) OVER (PARTITION BY ID ORDER BY StartDate) WHEN EndDate THEN 0 ELSE 1 END AS IsContinous
FROM (VALUES(222,CONVERT(date,'2019-04-01'),CONVERT(date,'2019-04-16')),
(222,CONVERT(date,'2019-04-16'),CONVERT(date,'2019-04-30')),
(562,CONVERT(date,'2019-04-01'),CONVERT(date,'2019-04-08')),
(562,CONVERT(date,'2019-04-08'),CONVERT(date,'2019-04-15')),
(562,CONVERT(date,'2019-04-15'),CONVERT(date,'2019-04-22')),
(562,CONVERT(date,'2019-04-22'),CONVERT(date,'2019-04-29')),
(228,CONVERT(date,'2019-04-02'),CONVERT(date,'2019-04-09')),
(228,CONVERT(date,'2019-04-10'),CONVERT(date,'2019-04-16')),
(228,CONVERT(date,'2019-04-15'),CONVERT(date,'2019-04-23')),
(228,CONVERT(date,'2019-04-26'),CONVERT(date,'2019-04-30')),
(228,CONVERT(date,'2019-04-01'),CONVERT(date,'2019-04-16'))) V (ID, StartDate, EndDate))
SELECT ID,
MIN(StartDate) AS StartDate,
MAX(EndDate) AS EndDate
FROM CTE
GROUP BY ID
HAVING SUM(IsContinous) = 0;