修改Postgres查询,使用generate_series计算多连续区间的累计总和
实现思路
- 先用
generate_series生成所有需要统计的连续时间区间的起始时间,拼接为完整的tsrange统计区间 - 将生成的统计区间与
event表关联,筛选出与当前区间重叠的事件 - 对每个统计区间单独执行时间裁剪、单事件权重计算、汇总求和逻辑
- 最终输出每个时间区间对应的总累计值
实现代码
WITH target_intervals AS ( -- 生成所有待统计的连续时间区间,示例为2021-08-01到2021-08-05的每日区间 SELECT tsrange( day_start, day_start + INTERVAL '1 day', '[)' ) AS stat_interval, day_start AS interval_sort FROM generate_series( '2021-08-01T00:00:00'::timestamp, -- 统计起始时间 '2021-08-04T00:00:00'::timestamp, -- 最后一个统计区间的起始时间 INTERVAL '1 day' -- 单个统计区间的跨度,可按需调整为1小时、1周等 ) AS t(day_start) ) SELECT ti.stat_interval, SUM( EXTRACT(epoch FROM ( LEAST(UPPER(e.order_dates), UPPER(ti.stat_interval)) - GREATEST(LOWER(e.order_dates), LOWER(ti.stat_interval)) ))::INTEGER * e.flow ) AS total_weight FROM target_intervals ti LEFT JOIN event e ON e.order_dates && ti.stat_interval GROUP BY ti.stat_interval, ti.interval_sort ORDER BY ti.interval_sort;
补充说明
你可以根据实际需求调整generate_series的三个参数,灵活修改统计的时间范围、区间跨度,不需要改动后续的计算逻辑。另外原查询中冗余的GROUP BY逻辑已做简化,执行效率会更高。
内容的提问来源于stack exchange,提问作者djangomachine
相关产品推荐
相关产品推荐

