Presto SQL - 按所有 dates/group 组合展开
Presto SQL - Expand by all dates/group combinations
我有一个 table,其中包括日期、组和值:
date group subgroup value
2018-01-01 A 1 20
2018-01-04 A 1 70
2018-01-06 A 1 80
我想填写 group/subgroup 组合缺少的日期,如下所示:
date group subgroup value
2018-01-01 A 1 20
2018-01-02 A 1 0
2018-01-03 A 1 0
2018-01-04 A 1 70
2018-01-05 A 1 0
2018-01-06 A 1 80
实现此目的的一种方法是交叉连接到具有日期序列的 table,然后左连接回到原始 table,但是,我想避免这样做,因为我有大量的组合都有不同的最小和最大日期,这种类型的解决方案更像是 "non-performant".
如果您想为每个 group/subgroup 组合使用不同的顺序,那么这很棘手。
但是,在 PrestoDB 中,您可以使用 sequence()
and unnest()
,它几乎和 generate_series()
一样方便(好吧,不是真的,但它们做同样的事情)。
查询将如下所示:
select gs.group, gs.subgroup, d.dte, coalesce(t.value, 0)
from (select group, subgroup, min(date) as mind, max(date) as maxd,
sequence(min(date), max(date)) as date_arr
from t
group by group, subgroup
) gs cross join
unnest(date_arr) d(dte) left join
t
on t.group = gs.grp and t.subgroup = gs.subgroup and t.date = d.dte
order by gs.group, gs.subgroup, d.dte;
我有一个 table,其中包括日期、组和值:
date group subgroup value
2018-01-01 A 1 20
2018-01-04 A 1 70
2018-01-06 A 1 80
我想填写 group/subgroup 组合缺少的日期,如下所示:
date group subgroup value
2018-01-01 A 1 20
2018-01-02 A 1 0
2018-01-03 A 1 0
2018-01-04 A 1 70
2018-01-05 A 1 0
2018-01-06 A 1 80
实现此目的的一种方法是交叉连接到具有日期序列的 table,然后左连接回到原始 table,但是,我想避免这样做,因为我有大量的组合都有不同的最小和最大日期,这种类型的解决方案更像是 "non-performant".
如果您想为每个 group/subgroup 组合使用不同的顺序,那么这很棘手。
但是,在 PrestoDB 中,您可以使用 sequence()
and unnest()
,它几乎和 generate_series()
一样方便(好吧,不是真的,但它们做同样的事情)。
查询将如下所示:
select gs.group, gs.subgroup, d.dte, coalesce(t.value, 0)
from (select group, subgroup, min(date) as mind, max(date) as maxd,
sequence(min(date), max(date)) as date_arr
from t
group by group, subgroup
) gs cross join
unnest(date_arr) d(dte) left join
t
on t.group = gs.grp and t.subgroup = gs.subgroup and t.date = d.dte
order by gs.group, gs.subgroup, d.dte;