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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:32:42