[英]Merge records with consecutive date ranges
我試圖弄清楚如何將多個記錄組合成一個記錄,其中第一個記錄的TERM日期是另一個記錄中生效日期的前一天。
以下是一些示例數據:
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,該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/ 1/1/2017 - 6/30/2018
9/1/2018 - 12/31/78
和一個來自9/1/2018 - 12/31/78
1/ 9/1/2018 - 12/31/78
。
ID 2還應具有兩個記錄2/1/2017 - 3/30/2018
/ 6/1/2018 - 12/31/78
和6/1/2018 - 12/31/78
。
ID 3還應具有兩個記錄-1/1/ 1/1/2017 - 10/31/2017
/ 12/1/2017 - 12/31/78
和12/1/2017 - 12/31/78
/ 1/1/2017 - 10/31/2017
12/1/2017 - 12/31/78
。
如何合並這些記錄? 記錄將大部分包含開始日期的月份的第一天,以及包含學期日期的月份的最后一天-我不必擔心異常值。
我研究了類似的問題,但它們只有兩條記錄需要合並,並使用與我相同的方法。
這是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執行上一行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.