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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:46:02