如何按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
相关产品推荐
相关产品推荐

