如何在SQL中删除各分类分组下最小ID的行?
删除每个Category分组中ID最小行的SQL方案
嘿,针对你要删除每个Category分组里ID值最小的行的需求,我整理了几种适配不同数据库的实用方案,你可以根据自己使用的数据库选择对应的写法:
方案一:子查询关联法(通用多数数据库)
这种思路先找出每个Category分组里的最小ID,然后删除ID匹配这些最小值的行。基础写法如下:
DELETE FROM your_table WHERE ID IN ( SELECT MIN(ID) FROM your_table GROUP BY Category );
注意:像MySQL这类数据库,不允许在DELETE语句的FROM子句中直接引用正在被修改的表,这时候需要嵌套一层子查询来规避这个限制:
DELETE FROM your_table WHERE ID IN ( SELECT min_id FROM ( SELECT MIN(ID) AS min_id FROM your_table GROUP BY Category ) AS temp_table );
方案二:窗口函数法(支持窗口函数的数据库)
如果你的数据库支持窗口函数(比如PostgreSQL、SQL Server 2008+、MySQL 8.0+),可以用ROW_NUMBER()窗口函数标记出每个分组里的最小ID行,再删除这些行,逻辑更直观:
WITH ranked_rows AS ( SELECT ID, ROW_NUMBER() OVER (PARTITION BY Category ORDER BY ID) AS row_rank FROM your_table ) DELETE FROM your_table WHERE ID IN (SELECT ID FROM ranked_rows WHERE row_rank = 1);
PostgreSQL 简化写法
PostgreSQL支持直接在DELETE中结合子查询使用窗口函数,写法更简洁:
DELETE FROM your_table WHERE ID IN ( SELECT ID FROM ( SELECT ID, ROW_NUMBER() OVER (PARTITION BY Category ORDER BY ID) AS row_rank FROM your_table ) AS temp WHERE row_rank = 1 );
验证结果
执行完删除语句后,用下面的查询验证结果:
SELECT * FROM your_table;
会得到你期望的输出:
ID Category Date
2 A 202101
4 B 202001
内容的提问来源于stack exchange,提问作者Valter Cheque
相关产品推荐
相关产品推荐

