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

如何按Key分组选取Year_month最小的行?SQL查询求助

解决每个Key取最小Year_month对应行的SQL问题

你的需求很明确:按Key分组,只保留每个组里Year_month最小的那一行数据。先说说你原来的SQL没成功的核心原因:

  • 子查询里的TOP 1没加ORDER BY Year_month ASC,数据库不知道你要取最小月份,返回的是随机行
  • 字段名拼写错误:你写的AMMOUNT应该是原表的Amount
  • TABLE是SQL关键字,别用它当表名,换成实际表名(比如下面例子里的YourTable)

给你几种靠谱的实现方法:

方法1:用窗口函数ROW_NUMBER()(推荐,通用型强)

这是现在主流数据库(SQL Server、MySQL 8.0+、PostgreSQL等)都支持的写法,逻辑清晰还能灵活扩展:

SELECT Key, Year_month, Amount
FROM (
    SELECT 
        Key, 
        Year_month, 
        Amount,
        -- 按Key分组,每组内按Year_month从小到大编号
        ROW_NUMBER() OVER (PARTITION BY Key ORDER BY Year_month ASC) AS row_num
    FROM YourTable
) AS ranked_data
WHERE row_num = 1; -- 取每组的第一行(也就是Year_month最小的行)

如果遇到同一个Key下有多个行Year_month相同的情况,把ROW_NUMBER()换成RANK(),就能保留所有最小月份的行,而不是只取其中一行。

方法2:用MIN()关联查询(兼容旧版数据库)

如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用分组取最小值再关联的方式:

SELECT t1.Key, t1.Year_month, t1.Amount
FROM YourTable t1
INNER JOIN (
    -- 先找出每个Key对应的最小Year_month
    SELECT Key, MIN(Year_month) AS min_year_month
    FROM YourTable
    GROUP BY Key
) AS t2 
ON t1.Key = t2.Key AND t1.Year_month = t2.min_year_month;

方法3:修正你原来的SQL写法

要是想沿用自己的思路,只需要补上排序和修正拼写:

SELECT Key, Year_month, Amount 
FROM YourTable AS T1 
WHERE Year_month = (
    SELECT TOP 1 Year_month 
    FROM YourTable 
    WHERE Key = T1.Key 
    ORDER BY Year_month ASC -- 必须加这行,指定取最小的月份
);

内容的提问来源于stack exchange,提问作者Carlos Ramírez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:53:38