Как получить StartDate и EndDate, сравнивая несколько строк и столбцов - PullRequest
0 голосов
/ 01 июня 2019

В моей таблице есть следующие данные:

ID     StartDate    EndDate 
-------------------------------
222    2019-04-01   2019-04-16
222    2019-04-16   2019-04-30
562    2019-04-01   2019-04-08
562    2019-04-08   2019-04-15
562    2019-04-15   2019-04-22
562    2019-04-22   2019-04-29
228    2019-04-02   2019-04-09
228    2019-04-10   2019-04-16
228    2019-04-15   2019-04-23
228    2019-04-26   2019-04-30
228    2019-04-01   2019-04-16

Условие: если Enddate = StartDate, то он должен проверить их StartDate и EndDate и ожидаемый результат, как показано ниже:

ID      StartDate       EndDate 
-----------------------------------
222     2019-04-01      2019-04-30
562     2019-04-01      2019-04-29

1 Ответ

0 голосов
/ 01 июня 2019

Я бы так и сделал, используя 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...