如何解决在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 举报,一经查实,本站将立刻删除。