如何用SQL删除同TYPE下超出数量的最小CODE数据记录
SQL实现方案
核心逻辑
- 首先按
TYPE字段分组,筛选出记录数≥4的分组 - 再取出上述每个分组内
CODE值最小的记录,执行删除操作 - 因
CODE为char(3)定长字符类型,直接按字符串排序即可匹配数值大小逻辑,若业务中存在无前置零的数字存储场景,可转为数值类型再排序
通用兼容写法(适配所有主流SQL版本)
DELETE t FROM 你的实际表名 t INNER JOIN ( SELECT TYPE, MIN(CODE) AS min_code FROM 你的实际表名 GROUP BY TYPE HAVING COUNT(*) >= 4 ) del_target ON t.TYPE = del_target.TYPE AND t.CODE = del_target.min_code;
支持窗口函数的数据库进阶写法(MySQL8.0+/PostgreSQL/Oracle/SQL Server)
适合需要更复杂排序、重复值处理的场景:
WITH type_rank AS ( SELECT 表主键字段, -- 替换为实际表的唯一主键字段 COUNT(*) OVER(PARTITION BY TYPE) AS type_record_cnt, ROW_NUMBER() OVER(PARTITION BY TYPE ORDER BY CODE ASC) AS code_sort_rn FROM 你的实际表名 ) DELETE FROM 你的实际表名 WHERE 表主键字段 IN ( SELECT 表主键字段 FROM type_rank WHERE type_record_cnt >= 4 AND code_sort_rn = 1 );
注意:如果同个TYPE分组下存在多条CODE完全相同的最小记录,第一种写法会删除所有符合条件的记录,若仅需删除1条,可根据业务需求加主键过滤或者LIMIT限制调整。
内容的提问来源于stack exchange,提问作者Li Li
相关产品推荐
相关产品推荐

