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
相关产品推荐
相关产品推荐

