簡體   English   中英

合並具有連續日期范圍的記錄

[英]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/786/1/2018 - 12/31/78

ID 3還應具有兩個記錄-1/1/ 1/1/2017 - 10/31/2017 / 12/1/2017 - 12/31/7812/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM