Teradata - 根据日期范围和时间戳记录分割

时间:2015-03-18 12:05:55

标签: sql date teradata overlapping

有一种情况我们有重叠日期的记录,我们需要根据日期拆分记录,考虑最近更新的记录。 请考虑以下示例 -

情景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

1 个答案:

答案 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