You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在PostgreSQL中利用其他分组时间戳向前填充分组时间序列

补全分组缺失的每日时间戳并生成完整结果表

现有一张数据表结构如下:

timegroupsub_groupcount
2022-01-01ATrue3
2022-01-01AFalse1
2022-01-01BTrue2
2022-01-01BFalse1
2022-01-02AFalse2
2022-01-02ATrue5
2022-01-02BFalse3
2022-01-03AFalse3
2022-01-03BFalse4
2022-01-03BTrue3

该表中,每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:31:31