BigQuery SQL两表按date和id关联取首行计算对应name的shares总和
你出现结果翻倍的核心原因是table1中同一个date+id组合存在重复行,左关联时每一行重复数据都会匹配到table2对应的shares值,导致sum统计时被重复累加。只需要提前对table1按date+id去重,每组仅保留一行参与关联即可。
方案1:用DISTINCT去重(写法最简单,兼容性最高)
SELECT t1.date, t1.name, COALESCE(SUM(t2.shares), 0) AS shares FROM ( SELECT DISTINCT date, id, name FROM table1 ) t1 LEFT JOIN table2 t2 ON t2.date = t1.date AND t2.id = t1.id GROUP BY t1.date, t1.name
说明:同一个date+id对应的name值是固定的,直接对三个字段去重就能得到每个date+id的唯一行。
方案2:用窗口函数取每组第一行(完全匹配“取每组第一行”的需求)
适用于支持窗口函数的SQL引擎(MySQL 8.0+、PostgreSQL、Spark SQL、Hive等):
SELECT t1.date, t1.name, COALESCE(SUM(t2.shares), 0) AS shares FROM ( SELECT date, id, name, ROW_NUMBER() OVER(PARTITION BY date, id ORDER BY date) AS rn FROM table1 ) t1 LEFT JOIN table2 t2 ON t2.date = t1.date AND t2.id = t1.id WHERE t1.rn = 1 GROUP BY t1.date, t1.name
说明:ROW_NUMBER()会给每个date+id分组的行按排序规则生成序号,筛选rn=1就可以只取每组的第一行参与后续关联计算。
内容的提问来源于stack exchange,提问作者Chique_Code
相关产品推荐
相关产品推荐

