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

BigQuery中分组聚合同时获取首个值的实现方案

单查询实现按ID分组的总金额与初始金额计算

下面提供几种无需多层嵌套查询的实现方式,适配不同数据库环境:

方法1:DISTINCT + 窗口函数组合

利用窗口函数为每行计算对应ID的总金额和初始金额,再通过DISTINCT去重得到每个ID的唯一结果:

SELECT DISTINCT
    id,
    SUM(amount) OVER (PARTITION BY id) AS 总金额,
    FIRST_VALUE(amount) OVER (PARTITION BY id ORDER BY event_date) AS 初始金额
FROM your_table;

原理:SUM() OVER (PARTITION BY id)会为当前ID的所有行返回该ID的总金额;FIRST_VALUE()按日期排序后返回当前ID的第一条记录金额;最后DISTINCT过滤掉重复的ID行,只保留每组的一条结果。

方法2:聚合函数 + 窗口函数筛选初始金额

在聚合查询中直接使用窗口函数定位每个ID的最早日期,再通过CASE筛选出对应金额:

SELECT
    id,
    SUM(amount) AS 总金额,
    MAX(CASE WHEN event_date = MIN(event_date) OVER (PARTITION BY id) THEN amount END) AS 初始金额
FROM your_table
GROUP BY id;

原理:MIN(event_date) OVER (PARTITION BY id)为每行返回所属ID的最早日期,CASE语句仅保留对应最早日期的金额,最后用MAX()提取该值(因每个ID仅一条最早日期记录,MAX/MIN效果一致)。此方法更贴合聚合逻辑,性能表现通常优于方法1。

方法3:FILTER子句(适用于PostgreSQL等支持的数据库)

如果你的数据库支持FILTER子句,可以简化初始金额的筛选逻辑:

SELECT
    id,
    SUM(amount) AS 总金额,
    MAX(amount) FILTER (WHERE event_date = MIN(event_date) OVER (PARTITION BY id)) AS 初始金额
FROM your_table
GROUP BY id;

原理:FILTER直接筛选出当前ID最早日期的记录,再用MAX()提取对应金额,写法更简洁。

内容的提问来源于stack exchange,提问作者ajor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:03:29