PostgreSQL实现按每N行分组聚合数据的查询方法
PostgreSQL 按固定行数切分分组聚合方案
核心实现思路:先给排序后的数据生成连续行号,再通过整数除法给每N行分配同一个分组标识,最后基于分组标识做聚合计算即可。
步骤1:准备测试数据
以下语句可以生成和描述完全一致的测试表,方便直接验证效果:
CREATE TABLE budget_data ( budget integer, date date ); INSERT INTO budget_data (budget, date) VALUES (10, '2022-05-01'), (5, '2022-05-02'), (15, '2022-05-03'), (16, '2022-05-04'), (22, '2022-05-05'), (13, '2022-05-06'), (23, '2022-05-07'), (56, '2022-05-08');
步骤2:通用聚合SQL
修改代码中GROUP BY后除法的分母(即N值),就可以自由调整每组的行数,支持N为任意正整数:
WITH sorted_rows AS ( SELECT budget, date, row_number() OVER (ORDER BY date ASC) AS rn FROM budget_data ) SELECT sum(budget) AS total_budget, min(date)::text || ' - ' || max(date)::text AS date_range FROM sorted_rows -- 此处分母2即为每组行数N,替换为3、5等值即可调整分组规则 GROUP BY (rn - 1) / 2 ORDER BY min(date);
效果验证
- 当N=2时,执行返回4行结果,和预期完全一致:
- 预算和15,对应日期区间2022-05-01 - 2022-05-02
- 预算和31,对应日期区间2022-05-03 - 2022-05-04
- 预算和35,对应日期区间2022-05-05 - 2022-05-06
- 预算和79,对应日期区间2022-05-07 - 2022-05-08
- 当N=3时,第一组返回预算和30,对应日期区间2022-05-01 - 2022-05-03,最后不足N行的剩余数据会自动归为最后一组,不需要额外处理。
说明:当前逻辑默认按日期升序排序后切分,如果需要按其他规则排序后再分组,只需要修改
row_number()窗口函数内的ORDER BY条件即可。
内容的提问来源于stack exchange,提问作者Anna S
相关产品推荐
相关产品推荐

