在PostgreSQL中利用其他分组时间戳向前填充分组时间序列
补全分组缺失的每日时间戳并生成完整结果表
现有一张数据表结构如下:
| time | group | sub_group | count |
|---|---|---|---|
| 2022-01-01 | A | True | 3 |
| 2022-01-01 | A | False | 1 |
| 2022-01-01 | B | True | 2 |
| 2022-01-01 | B | False | 1 |
| 2022-01-02 | A | False | 2 |
| 2022-01-02 | A | True | 5 |
| 2022-01-02 | B | False | 3 |
| 2022-01-03 | A | False | 3 |
| 2022-01-03 | B | False | 4 |
| 2022-01-03 | B | True | 3 |
该表中,每个group+sub_group组合的count值每日递增,但当某组count值未发生变化时,对应日期的行就会缺失。例如缺失的行包括:
| 2022-01-02 | B | True | 2 |
| 2022-01-03 | A | True | 5 |
需要为所有group+sub_group组合生成连续的每日时间戳,得到完整的结果表。
我原本考虑使用partition by...over这类查询结构,但不清楚如何基于其他分组的时间戳进行分区,因为没有可用于向前填充的NULL count值。
已实现的中间状态代码
目前我已经完成了补全分组间缺失时间戳的中间状态(仅需每日频率),代码如下:
with time_range as ( select min(time) as start_time, -- current_timestamp - interval '2 day' max(time) as end_time from my_table-- current_timestamp ), interested_events as ( select e.group, e.sub_group, e.time, e.count from my_table e ), classes_having_events as ( select distinct group, sub_group from interested_events ORDER BY group, sub_group ), periods as ( select ts as period_start, ts + interval '1 day' as period_end from generate_series( (select start_time from time_range), (select end_time from time_range) - interval '1 second', interval '1 day') ts ), resampled as ( SELECT period_start, period_end, classes_having_events.group, classes_having_events.sub_group, interested_events.count FROM periods CROSS JOIN classes_having_events LEFT JOIN interested_events ON time >= period_start AND time < period_end AND interested_events.group = classes_having_events.group AND interested_events.sub_group = classes_having_events.sub_group ORDER BY period_start DESC )
内容的提问来源于stack exchange,提问作者Basiti
相关产品推荐
相关产品推荐

