【问题标题】:Managing historical records with date range SQL使用日期范围 SQL 管理历史记录
【发布时间】:2021-06-15 19:51:02
【问题描述】:

我在 Teradata 中有一张表,其中包含如下历史数据:

表_A

A|B|C|  d_d       |   d_f
1|8|2|'2020-01-01'|'2020-02-01'
1|8|2|'2020-02-02'|'2020-03-31'
1|8|3|'2020-04-01'|'2020-05-11'
1|8|3|'2020-05-11'|'9999-12-31'
7|4|5|'2020-07-01'|'2020-09-12'
7|4|5|'2020-09-13'|'9999-12-31'

在输出中我正在寻找这样的东西:

    A|B|C|  d_d       |   d_f
    1|8|2|'2020-01-01'|'2020-03-31'
    1|8|3|'2020-04-01'|'9999-12-31'
    7|4|5|'2020-07-01'|'9999-12-31'

我试过了,但它错过了一些忽略行的东西(例如示例中的第 2、4、6 行)

select 
A
,B
,C
,d_d
,case when lead(C)over(partition by a,b order by d_d) <> C 
then cast('9999-12-31' as date)
else lead(d_f)over(partition by a,b order by d_d) end as d_f

from table_a

【问题讨论】:

    标签: sql teradata teradata-sql-assistant


    【解决方案1】:

    Teradata 中有一个很好的 SQL 扩展来规范重叠时段。它仅适用于数据类型 PERIOD,但可以动态创建:

    with cte as
     (
       select NORMALIZE
          A
         ,B
         ,C
         -- PERIODs are inclusive-exclusive, the -1 adjusts for that
         ,period(d_d -1 , d_f) as pd 
       from table_a
     )
       select
          A
         ,B
         ,C
         ,begin(pd) +1 as d_d -- revert back to inclusive-inclusive
         ,end(pd) as d_f
       from cte
    

    【讨论】:

    • 谢谢@dnoeth,这是我要找的,只是为了更正第二个选择不应该正常化
    【解决方案2】:

    对于您提供的数据,聚合应该起作用:

    select a, b, c, min(d_d), max(d_f)
    from a
    group by a, b, c;
    

    【讨论】:

    • 谢谢,但我认为如果我们有这行 1|8|2|'2020-06-11'|'9999-12-31' 并列在第 4 行,这将不起作用row by d_f = '2020-06-10',所以这里我们不会尊重数据的历史性
    猜你喜欢
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多