在BigQuery Standard SQL中如何查询分组后指定字段值全相同的记录
BigQuery Standard SQL 实现方案
核心逻辑为按A、B字段分组后,判断分组内C字段的所有取值是否一致,有两种常用实现方式:
方式1:去重计数判断(写法简单直观)
SELECT A, B, ANY_VALUE(C) AS C -- 分组内C取值完全一致,可取任意一条的C值 FROM `你的项目ID.你的数据集名.你的表名` GROUP BY A, B HAVING COUNT(DISTINCT C) = 1
方式2:极值比对判断(大数据量下性能更优)
无需执行去重计数,仅通过比对分组内C的最小值和最大值即可判断取值是否一致,执行效率更高:
SELECT A, B, MIN(C) AS C -- 也可替换为MAX(C),结果完全一致 FROM `你的项目ID.你的数据集名.你的表名` GROUP BY A, B HAVING MIN(C) = MAX(C)
特殊场景补充
如果需要将分组内C全为NULL的场景也纳入返回结果,需调整HAVING条件处理NULL值比对逻辑:
HAVING MIN(C) = MAX(C) OR (MIN(C) IS NULL AND MAX(C) IS NULL)
如需返回分组内所有明细行
如果不需要聚合,仅需要过滤出符合条件的分组下的全部原始数据,可使用窗口函数实现:
SELECT A, B, C FROM ( SELECT *, MIN(C) OVER(PARTITION BY A, B) AS min_c, MAX(C) OVER(PARTITION BY A, B) AS max_c FROM `你的项目ID.你的数据集名.你的表名` ) WHERE min_c = max_c OR (min_c IS NULL AND max_c IS NULL) -- 同样按需添加全NULL场景的判断
内容的提问来源于stack exchange,提问作者Davout
相关产品推荐
相关产品推荐

