SQL中按ID分组后获取对应最大年份的value值的正确实现方法
解决按id获取最大年份对应value的SQL问题
嘿,我来帮你搞定这个问题!你之前的SQL语句没法正常运行,主要有两个原因:一是FIRST()并不是标准SQL的聚合函数,不同数据库对它的支持和用法差异很大;二是直接用GROUP BY id后,MAX(year)和value是独立计算的,数据库没办法保证value就是对应最大年份那条记录的数值。
下面给你几种通用且可靠的实现方法,适配大多数主流数据库(MySQL、PostgreSQL、SQL Server等):
方法一:使用窗口函数(推荐,高效简洁)
窗口函数是现代数据库的常用特性,能很清晰地实现分组排序后取指定行的需求:
WITH ranked_records AS ( SELECT id, year, value, -- 按id分组,每组内按year降序排名,最大年份的记录排第1 ROW_NUMBER() OVER (PARTITION BY id ORDER BY year DESC) AS rank_num FROM t ) SELECT id, year, value FROM ranked_records WHERE rank_num = 1;
如果你的数据库不支持CTE(比如MySQL 5.x),也可以把CTE改成子查询:
SELECT id, year, value FROM ( SELECT id, year, value, ROW_NUMBER() OVER (PARTITION BY id ORDER BY year DESC) AS rank_num FROM t ) AS ranked_records WHERE rank_num = 1;
方法二:关联子查询(兼容旧版本数据库)
如果你的数据库不支持窗口函数,这种方法兼容性更好:
SELECT t.id, t.year, t.value FROM t -- 子查询找到当前id对应的最大年份,主查询匹配该年份的记录 WHERE t.year = ( SELECT MAX(year) FROM t AS t2 WHERE t2.id = t.id );
方法三:GROUP BY + JOIN
先通过分组得到每个id的最大年份,再和原表关联获取对应value:
SELECT t.id, max_year.year, t.value FROM t JOIN ( -- 先分组得到每个id的最大年份 SELECT id, MAX(year) AS year FROM t GROUP BY id ) AS max_year ON t.id = max_year.id AND t.year = max_year.year;
这三种方法都能得到你期望的结果,其中窗口函数的写法最直观,也更容易维护,优先推荐使用。
内容的提问来源于stack exchange,提问作者Bruno Mello
相关产品推荐
相关产品推荐

