有一种情况我们有重叠日期的记录,我们需要根据日期拆分记录,考虑最近更新的记录。 请考虑以下示例 -
情景1:
Source Destination Begin_Date End_Date Last_Updated Value
-------------------------------------------------------------------------
ABC 123 3/15/2015 12/15/2015 3/17/2015 9:18 50
ABC 123 4/15/2015 5/15/2015 3/18/2015 2:31 44
Source Destination Begin_Date End_Date Value
----------------------------------------------------------
ABC 123 3/15/2015 4/14/2015 50
ABC 123 4/15/2015 5/15/2015 44
ABC 123 5/16/2015 12/15/2015 50
情景2:
Source Destination Begin_Date End_Date Last_Updated Value
-----------------------------------------------------------------------
ABC 123 3/15/2015 12/15/2015 3/17/2015 9:18 50
ABC 123 4/15/2015 12/15/2015 3/18/2015 2:31 44
Source Destination Begin_Date End_Date Value
--------------------------------------------------------
ABC 123 3/15/2015 4/14/2015 50
ABC 123 4/15/2015 12/15/2015 44
情景3:
Source Destination Begin_Date End_Date Last_Updated Value
------------------------------------------------------------------------
ABC 123 4/15/2015 12/15/2015 3/17/2015 9:18 50
ABC 123 3/15/2015 12/15/2015 3/18/2015 2:31 44
Source Destination Begin_Date End_Date Value
--------------------------------------------------------
ABC 123 3/15/2015 12/15/2015 44
答案 0 :(得分:0)
这个答案主要是关于第一种情况,我认为这是最复杂的情况。我相信其余的场景可以围绕第一个场景的查询进行一些改动,更不用说我懒得创建整个解决方案。
您还需要根据您的要求将Last_Updated
列合并到此逻辑中。
最简单的逻辑是忽略End_Date
。对数据进行排序,并将每行的Begin_Date
用作前一行中的End_Date
。然后丢弃当前记录的Begin_Date
=先前记录的End_Date
的行。我相信这将处理除第一个之外的所有场景。
对于第一种情况,您需要识别重叠。我想这可以通过加入套装来实现,但这将是乏味且昂贵的。我能够使用窗口操作(下面查询的UNION
子句中的第2个集合)来识别重叠,其中X是包含场景1的数据的表
SELECT SRC,
DEST,
BEGIN_DATE,
END_DATE,
VAL
FROM X
UNION
SELECT SRC,
DEST,
MIN(END_DATE) OVER( PARTITION BY SRC, DEST
ORDER BY BEGIN_DATE DESC ROWS 1 PRECEDING) + 1,
END_DATE,
VAL
FROM X
QUALIFY MIN(END_DATE) OVER( PARTITION BY SRC, DEST
ORDER BY BEGIN_DATE DESC ROWS 1 PRECEDING) < END_DATE
将这些结果存储在表z中,可以使用
构建所需的历史记录SELECT SRC,
DEST,
BEGIN_DATE,
CAST(COALESCE(MAX(BEGIN_DATE) OVER( PARTITION BY SRC, DEST
ORDER BY BEGIN_DATE ASC
ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING),
END_DATE) AS DATE) - 1 AS END_DATE,
VAL
FROM Z