You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:37:40