【问题标题】:Propagate missing dates in teradata - select query在 teradata 中传播缺失的日期 - 选择查询
【发布时间】:2021-07-22 20:13:00
【问题描述】:

我有一张如下所示的表格:

my_date item_id. sales
2020-03-01 GMZS72429 2
2020-03-07 GMZS72429 2
2020-03-09 GMZS72429 1
2020-03-04 GMZS72425 1

我希望它看起来像这样

my_date item_id sales
2020-03-01 GMZS72429 2
2020-03-02 GMZS72429 0
... ... ...
2020-03-05 GMZS72429 0
2020-03-06 GMZS72429 0
2020-03-07 GMZS72429 2
2020-03-08 GMZS72429 0
2020-03-09 GMZS72429 1
2020-03-01 GMZS72425 0
2020-03-02 GMZS72425 0
2020-03-03 GMZS72425 0
2020-03-04 GMZS72425 1
... ... ...
2020-03-09 GMZS72425 0

由于我一直在努力处理 Teradata 的文档,因此我尝试使用另一个表生成 item_id - my_date 对,然后使用左连接:

with a1 as(
select distinct my_date, item_id from some_table_with_the_item_ids_and_all_dates
) 
select a1.my_date, a1.item_id, coalesce(sales, 0) as sales
from a1 left join my_table on a1.item_id=my_table.item_id and a1.my_date=my_table.my_date;

这行得通,但速度非常慢,而且丑陋。我想知道是否有更好的内置(或替代)方法来做到这一点。谢谢

【问题讨论】:

    标签: sql date teradata missing-data


    【解决方案1】:

    一个简单的选择是使用 Teradata 的内置日期视图作为驱动程序:

    select
    coalesce(v.my_date,c.calendar_date),
    item_id,
    coalesce(v.sales,0)
    from
    sys_calendar.calendar c
    left join your_table v
        on v.my_date = c.calendar_date
    where
        c.calendar_date between (select min(my_date) from your_table ) and (select max(my_date) from your_table)
    order by 1
    

    【讨论】:

    • 谢谢,如果项目不同,我该如何适应呢?我编辑了问题以改进描述
    • @Mstaino- Dnoeth 的回答已经说明了这一点(partition by 子句)。
    【解决方案2】:

    这是 Teradata 的 EXPAND ON 语法的一个用例:

    select 
       new_date
      ,item_id 
      ,case when my_date = new_date then sales else 0 end
    from
     (
       select dt.*, begin(p2) as new_date
       from
        (
          select t.*
             -- create a period for expansion in the next step
            ,period(my_date, lead(my_date, 1, my_date+1)
                             over (partition by item_id
                                   order by my_date)) as pd
          from vt as t
        ) as dt
       -- now create the missing dates
       expand on pd as p2
     ) as dt
     
    

    【讨论】:

    • 谢谢,如果项目不同,我该如何调整?我编辑了问题以改进描述
    • 不用适配,这个已经准备好多个项目了:partition by item_id
    猜你喜欢
    • 2018-05-02
    • 2019-04-16
    • 2017-12-31
    • 2014-06-11
    • 2012-03-05
    • 1970-01-01
    • 2021-08-03
    • 2012-09-17
    • 1970-01-01
    相关资源
    最近更新 更多