微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在teradata中传播缺失的日期 - 选择查询

如何解决在teradata中传播缺失的日期 - 选择查询

我有一张看起来像这样的表格:

我的日期 item_id。 销售
2020-03-01 GMZS72429 2
2020-03-07 GMZS72429 2
2020-03-09 GMZS72429 1
2020-03-04 GMZS72425 1

我希望它看起来像这样

我的日期 item_id 销售
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;

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

解决方法

一个简单的选择是使用 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
,

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

select 
   new_date,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
 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。