如何获取每年最高round对应的raceid:解决group by无法选非分组列问题
解决方案
方案1:窗口函数法(推荐)
支持PostgreSQL、MySQL 8.0+、SQL Server、Oracle等所有主流新版数据库,写法简洁性能优异:
WITH ranked_races AS ( SELECT raceid, year, round, -- 按年份分组,组内按轮次倒序排名 ROW_NUMBER() OVER (PARTITION BY year ORDER BY round DESC) AS rn FROM races ) -- 取每个年份排名第一的记录,就是当年轮次最高的比赛 SELECT year, round, raceid FROM ranked_races WHERE rn = 1 ORDER BY year;
如果同一年可能存在多个轮次同为最大值的记录,需要全部返回的话,把ROW_NUMBER()替换为RANK()即可。
方案2:子查询关联法(兼容全版本数据库)
适合不支持窗口函数的旧版数据库使用:
SELECT r.year, r.round, r.raceid FROM races r -- 关联你原本的分组查询结果,匹配对应年份的最大轮次 INNER JOIN ( SELECT year, MAX(round) AS max_round FROM races GROUP BY year ) t ON r.year = t.year AND r.round = t.max_round ORDER BY r.year;
注意:不推荐使用关闭SQL模式(如MySQL的
ONLY_FULL_GROUP_BY)的方式直接在分组查询中加非分组字段,这种写法是非标准SQL,结果稳定性差且跨数据库兼容性极低。
内容的提问来源于stack exchange,提问作者Breno Jones
相关产品推荐
相关产品推荐

