SQL查询:使用MIN()+GROUP BY时如何获取对应行的其他列数据?
获取每个ries_cod对应最小indi_cod的完整行数据
下面提供几种可行的SQL写法,适配你的需求:
方法一:窗口函数(推荐,性能更优)
用ROW_NUMBER()给每个ries_cod分组内的行按indi_cod升序编号,取编号为1的行就是对应最小indi_cod的完整记录:
SELECT ries_cod, indi_cod, date, time, level FROM ( SELECT ries_cod, indi_cod, date, time, level, ROW_NUMBER() OVER (PARTITION BY ries_cod ORDER BY indi_cod ASC) AS rn FROM `my-project-01-354113.indi_cod.second_step` ) t WHERE rn = 1 ORDER BY ries_cod;
如果同一个ries_cod下有多个相同的最小indi_cod,ROW_NUMBER()会随机返回其中一行;要是想保留所有最小值对应的行,把ROW_NUMBER()换成RANK()或DENSE_RANK()即可。
方法二:子查询关联
先通过子查询算出每个ries_cod的最小indi_cod,再和原表关联匹配,拿到对应行的其他字段:
SELECT t.ries_cod, t.indi_cod, t.date, t.time, t.level FROM `my-project-01-354113.indi_cod.second_step` t INNER JOIN ( SELECT ries_cod, MIN(indi_cod) AS min_indi_cod FROM `my-project-01-354113.indi_cod.second_step` GROUP BY ries_cod ) sub ON t.ries_cod = sub.ries_cod AND t.indi_cod = sub.min_indi_cod ORDER BY t.ries_cod;
这种写法在indi_cod唯一时效果稳定,若存在重复的最小值,会返回所有对应的行。
方法三:聚合函数结合GROUP BY(限特定场景)
如果每个(ries_cod, indi_cod)组合对应的date、time、level是唯一的,可以用BigQuery支持的ANY_VALUE()函数直接获取对应字段:
SELECT ries_cod, MIN(indi_cod) AS min_indi_cod, ANY_VALUE(date) AS date, ANY_VALUE(time) AS time, ANY_VALUE(level) AS level FROM `my-project-01-354113.indi_cod.second_step` GROUP BY ries_cod ORDER BY ries_cod;
注意:ANY_VALUE()会返回分组内匹配最小indi_cod的任意一个字段值,只有当数据唯一时才建议使用。
内容的提问来源于stack exchange,提问作者Brenda O.
相关产品推荐
相关产品推荐

