BigQuery SQL分组行时如何覆盖指定列的无效值
你不需要拆分两个表做LEFT JOIN,直接用单表聚合就能实现需求,执行效率更高,逻辑也更简洁。
核心逻辑
按url字段分组时:
- 对
pvs字段直接用SUM()聚合求和 - 对
tags字段,先把值为'-'的占位符转为NULL,再通过聚合函数提取非空的有效值即可,聚合函数会自动跳过NULL值
可直接运行的代码(BigQuery环境)
SELECT url, MAX(IF(tags != '-', tags, NULL)) AS tags, SUM(pvs) AS pvs FROM tabla_1 GROUP BY url
逻辑说明
- 你给出的样例数据中,同一个
url分组下只会存在1个非'-'的有效tags值,用MAX()或者MIN()做聚合都能准确拿到这个有效值,不会出错 - 整个查询只需要对表做一次扫描,相比拆分两表JOIN的写法,性能优势非常明显,代码可维护性也更高
拓展场景:如果后续业务调整,同一个url下可能存在多个不同的有效tags值,可以把tags的聚合逻辑替换为
STRING_AGG(DISTINCT IF(tags != '-', tags, NULL), ', '),会自动将同组下所有有效tags去重后用逗号拼接。
内容的提问来源于stack exchange,提问作者marzalja
相关产品推荐
相关产品推荐

