SQL列选择、GROUP BY语法规则及JOIN关联查询相关问题咨询
BigQuery中GROUP BY语法常见问题解答
聚合函数与GROUP BY的对应规则
不是所有查询选中的列都需要放入GROUP BY子句,仅需满足以下规则即可:
- 被
SUM()、COUNT()、MAX()等聚合函数包裹的列,不需要放入GROUP BY子句 - 未被聚合函数包裹的非聚合列,必须全部出现在GROUP BY子句中,否则会触发语法报错
合法示例
-- user_id为非聚合列放入GROUP BY,order_cnt为聚合结果无需放入 SELECT user_id, COUNT(*) AS order_cnt FROM orders GROUP BY user_id
另外BigQuery对标准SQL做了扩展支持功能依赖识别:如果GROUP BY的字段是某张表的主键,那么该表的其他非聚合列即使没有显式放入GROUP BY子句,也不会触发报错,因为主键可以唯一确定同表其他字段的取值。
JOIN搭配COUNT(*)常见报错/结果异常原因
关联查询搭配计数出错的问题,基本都属于以下两类场景:
1. 关联后行数膨胀导致计数结果不符合预期
当你关联一对多关系的表时,主表单行会匹配子表的多行数据,直接使用COUNT(*)统计的是关联后结果集的总行数,而非你预期的主表/某张子表的行数。
示例:统计每个用户的收货地址数量时额外关联了订单表,同一用户的同一个收货地址会匹配到多条订单记录,直接
COUNT(*)会导致计数结果偏大
错误写法
SELECT u.user_id, COUNT(*) AS address_cnt FROM users u LEFT JOIN user_addresses a ON u.user_id = a.user_id LEFT JOIN orders o ON u.user_id = o.user_id GROUP BY u.user_id
修正写法
改用COUNT(DISTINCT 目标表主键)实现去重计数:
SELECT u.user_id, COUNT(DISTINCT a.address_id) AS address_cnt FROM users u LEFT JOIN user_addresses a ON u.user_id = a.user_id LEFT JOIN orders o ON u.user_id = o.user_id GROUP BY u.user_id
2. 非聚合列归属不清晰导致语法报错
多表关联后如果存在来自不同表的非聚合列,要确保所有非聚合列都已经放入GROUP BY子句,建议所有字段都添加表别名限定,避免多表同名字段导致的解析错误。
内容的提问来源于stack exchange,提问作者lillemongrab
相关产品推荐
相关产品推荐

