如何去除两列值重复的行?仅保留theDiff最小的记录
解决方法:保留每组重复日期中
theDiff最小的记录 针对你要去除start_date和end_date相同的重复行,且只保留theDiff值最小记录的需求,最通用且高效的方式是使用窗口函数,几乎所有主流数据库(MySQL 8.0+、SQL Server、Oracle、PostgreSQL等)都支持这种写法。
核心SQL语句
假设你的表名为your_table,可以用以下查询实现需求:
WITH ranked_records AS ( SELECT start_date, end_date, theDiff, -- 按日期组合分组,每组内按theDiff升序排序,最小的记录行号为1 ROW_NUMBER() OVER (PARTITION BY start_date, end_date ORDER BY theDiff ASC) AS rn FROM your_table ) SELECT start_date, end_date, theDiff FROM ranked_records WHERE rn = 1;
逻辑解释
PARTITION BY start_date, end_date:将表数据按start_date和end_date的组合分组,每一组就是你所说的“重复行”集合。ORDER BY theDiff ASC:在每个分组内,按照theDiff从小到大排序,这样theDiff最小的记录会被标记为行号1。- 最后通过
WHERE rn = 1筛选出每组中theDiff最小的那条记录,完全匹配你的需求。
针对PostgreSQL的简化写法
如果你使用的是PostgreSQL,还可以用DISTINCT ON语法让代码更简洁:
SELECT DISTINCT ON (start_date, end_date) start_date, end_date, theDiff FROM your_table ORDER BY start_date, end_date, theDiff ASC;
性能优化提示
如果表中数据量很大,建议给start_date和end_date创建联合索引,能大幅提升窗口函数的执行效率:
CREATE INDEX idx_date_pair ON your_table(start_date, end_date);
内容的提问来源于stack exchange,提问作者noobeerp
相关产品推荐
相关产品推荐

