MySQL中SELECT * GROUP BY写法,在BigQuery中如何最简实现?
在BigQuery中实现类似MySQL GROUP BY非标准行为的最简方式
MySQL里SELECT * FROM table GROUP BY col1, col2的逻辑是按col1, col2分组后返回每个分组内的任意一行数据,这是MySQL的非标准SQL扩展。在遵循标准SQL的BigQuery中,有两种简便实现方式:
方式一:窗口函数筛选分组行(推荐,适合多列场景)
这种方式无需逐个指定非分组列,直接保留所有字段:
WITH grouped_data AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2) AS rn FROM `your-project.your-dataset.your-table` ) SELECT * EXCEPT(rn) FROM grouped_data WHERE rn = 1;
- 逻辑:用
PARTITION BY col1, col2分组,ROW_NUMBER()给每组内的行编号,取编号为1的行(即每组任意一行)。 - 优势:不用手动列出所有非分组列,适合表有大量字段(比如100列)的场景。
方式二:使用ANY_VALUE聚合函数
如果需要显式处理每个非分组列,可以用BigQuery内置的ANY_VALUE函数:
SELECT col1, col2, ANY_VALUE(col3) AS col3, ANY_VALUE(col4) AS col4, -- 依次添加其他所有非分组列 FROM `your-project.your-dataset.your-table` GROUP BY col1, col2;
- 逻辑:
ANY_VALUE会返回分组内某一行的对应列值,和MySQL的非标准行为逻辑一致。 - 局限:列数很多时需要逐个列出,不如窗口函数高效。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

