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

如何去除两列值重复的行?仅保留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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:19:49