0- 描述
描述:时间序列–构造连续日期
表名:t18
表字段及内容:
a b c
101 2018-01-01 10
101 2018-01-03 20
101 2018-01-06 40
102 2018-01-02 20
102 2018-01-04 30
102 2018-01-07 60
1- 问题一
描述:将表中数据的b字段扩充至范围[2018-01-01, 2018-01-07],并累积对c求和。
b字段的值是较稀疏的。
输出结果如下所示:
a b c d
101 2018-01-01 10 10
101 2018-01-02 0 10
101 2018-01-03 20 30
101 2018-01-04 0 30
101 2018-01-05 0 30
101 2018-01-06 40 70
101 2018-01-07 0 70
102 2018-01-01 0 0
102 2018-01-02 20 20
102 2018-01-03 0 20
102 2018-01-04 30 50
102 2018-01-05 0 50
102 2018-01-06 0 50
102 2018-01-07 60 110
参考答案:
select
a,
b,
c,
sum(c) over(partition by a order by b) as d
from
(
select
t1.a,
t1.b,
case
when t18.b is not null then t18.c
else 0
end as c
from
(
select
a,
date_add(s,pos) as b
from
(
select
a,
'2018-01-01' as s,
'2018-01-07' as r
from (select a from t18 group by a) ta
) m lateral view
posexplode(split(space(datediff(from_unixtime(unix_timestamp(r,'yyyy-MM-dd')),from_unixtime(unix_timestamp(s,'yyyy-MM-dd')))), '')) t as pos, val
) t1
left join t18
on t1.a = t18.a and t1.b = t18.b
) ts;