Объединить записи с последовательными диапазонами дат - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь выяснить, как объединить несколько записей в одну, где дата TERM первой записи является днем, предшествующим дате EFFective в другой записи.

Вот некоторые примеры данных:

SELECT 1 AS MEM_ID, CAST('2017-01-01' AS DATE) AS EFF_DATE, CAST('2017-05-31' AS DATE) AS TERM_DATE
INTO #TEMP 
UNION 
SELECT 1 AS MEM_ID, CAST('2017-06-01' AS DATE) AS EFF_DATE, CAST('2018-01-31' AS DATE)
UNION 
SELECT 1 AS MEM_ID, CAST('2018-02-01' AS DATE) AS EFF_DATE, CAST('2018-06-30' AS DATE)
UNION 
SELECT 1 AS MEM_ID, CAST('2018-09-01' AS DATE) AS EFF_DATE, CAST('2078-12-31' AS DATE)
UNION 
SELECT 2 AS MEM_ID, CAST('2017-02-01' AS DATE) AS EFF_DATE, CAST('2017-04-30' AS DATE)
UNION 
SELECT 2 AS MEM_ID, CAST('2017-05-01' AS DATE) AS EFF_DATE, CAST('2018-03-31' AS DATE)
UNION 
SELECT 2 AS MEM_ID, CAST('2018-06-01' AS DATE) AS EFF_DATE, CAST('2018-06-30' AS DATE)
UNION 
SELECT 2 AS MEM_ID, CAST('2018-07-01' AS DATE) AS EFF_DATE, CAST('2078-12-31' AS DATE)
UNION 
SELECT 3 AS MEM_ID, CAST('2017-01-01' AS DATE) AS EFF_DATE, CAST('2017-10-31' AS DATE)
UNION 
SELECT 3 AS MEM_ID, CAST('2017-12-01' AS DATE) AS EFF_DATE, CAST('2018-03-31' AS DATE)
UNION 
SELECT 3 AS MEM_ID, CAST('2018-04-01' AS DATE) AS EFF_DATE, CAST('2018-06-30' AS DATE)
UNION 
SELECT 3 AS MEM_ID, CAST('2018-07-01' AS DATE) AS EFF_DATE, CAST('2078-12-31' AS DATE)

Я создал CTE, который присоединяется к себе с помощью DATE = DATE - 1 второй записи.к сожалению, он объединяет только две записи, и я не понял, как сделать его рекурсивным

;WITH TEST AS (
SELECT DISTINCT MEM_ID,
    EFF_DATE,
    TERM_DATE, 
    ROW_NUMBER()OVER(ORDER BY MEM_ID, EFF_DATE) ROW_NUM
FROM #TEMP
)

SELECT * 
FROM TEST T 
INNER JOIN TEST T2 ON T.MEM_ID = T2.MEM_ID AND T.TERM_DATE = DATEADD(DAY, -1, T2.EFF_DATE)

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

ID 1 должен иметь две записи - одну из 1/1/2017 - 6/30/2018и одна из 9/1/2018 - 12/31/78.

ID 2 также должна иметь две записи - 2/1/2017 - 3/30/2018 и 6/1/2018 - 12/31/78.

ID 3 также должна иметь две записи - 1/1/2017 - 10/31/2017 и 12/1/2017 - 12/31/78.

Как я могу объединить эти записи?У записей в основном будет первое число месяца для даты начала и последний день месяца для даты срока - мне не нужно беспокоиться о выбросах.

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

1 Ответ

0 голосов
/ 26 сентября 2018

Это тип вещей, для которых LAG и LEAD полезны.

;WITH CTE AS (SELECT DISTINCT  MEM_ID,
                  EFF_DATE,
                  LEAD(EFF_DATE, 1, NULL) OVER (PARTITION BY MEM_ID ORDER BY MEM_ID, EFF_DATE) AS TERM_DATE
              FROM #TEMP
             )

SELECT MEM_ID,
       EFF_DATE,
       TERM_DATE, 
       DATEADD(DAY, -1, TERM_DATE) AS D2
FROM CTE;

LEAD в основном достигает пика в следующей строке и включает в себя указанный столбец из пика в строке в этой строке.LAG выполняет предыдущий ряд.

...