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

工作场景SQL查询去重求助:ModifiedDate同日多修改致重复记录

嘿,这个问题我太熟了!之前做数据报表的时候也碰到过类似的坑——datetime类型的ModifiedDate哪怕在同一天,只要时分秒不一样,SELECT DISTINCT和普通的GROUP BY根本没法帮你去重,因为它们会把每个不同的时间戳当成独立的记录。

我给你几个针对性的解决方案,你可以根据实际需求选:

1. 保留同一天内最新的那条修改记录(最常用场景)

如果你的需求是每个ID在同一天只留最后修改的那条,用窗口函数ROW_NUMBER()绝对是最优解。它能帮你按日期分组后,给每条记录排个序,只取最新的那条:

WITH RankedRecords AS (
    SELECT 
        ID, Name, RelationID, RelationName, RelationDescription, Year, ModifiedDate, ModifiedBy,
        -- 按ID+日期分组,按修改时间倒序排序
        ROW_NUMBER() OVER (
            PARTITION BY ID, CAST(ModifiedDate AS DATE)
            ORDER BY ModifiedDate DESC
        ) AS rn
    FROM YourTableName  -- 记得替换成你的表名
    -- 这里可以加你的年份过滤,比如 WHERE Year = 2024
)
SELECT ID, Name, RelationID, RelationName, RelationDescription, Year, ModifiedDate, ModifiedBy
FROM RankedRecords
WHERE rn = 1;

注意:不同数据库提取日期的语法略有不同:

  • SQL Server/Azure:CAST(ModifiedDate AS DATE)
  • MySQL:DATE(ModifiedDate)
  • Oracle:TRUNC(ModifiedDate)

2. 不需要具体时间,只保留日期维度的去重

如果你的业务场景不需要精确到时分秒,只关心修改日期,那可以把ModifiedDate转成DATE类型后再去重:

用DISTINCT的写法:

SELECT DISTINCT
    ID, Name, RelationID, RelationName, RelationDescription, Year,
    CAST(ModifiedDate AS DATE) AS ModifiedDate, ModifiedBy
FROM YourTableName
-- WHERE Year = 2024;

用GROUP BY的写法:

SELECT 
    ID, Name, RelationID, RelationName, RelationDescription, Year,
    CAST(ModifiedDate AS DATE) AS ModifiedDate, ModifiedBy
FROM YourTableName
-- WHERE Year = 2024
GROUP BY ID, Name, RelationID, RelationName, RelationDescription, Year, CAST(ModifiedDate AS DATE), ModifiedBy;

为什么你之前的方法没用?

  • SELECT DISTINCT:因为ModifiedDate是datetime,哪怕日期相同,时分秒不同就会被判定为不同的记录,所以去重无效。
  • 普通GROUP BY:如果你之前GROUP BY里包含了完整的ModifiedDate(datetime类型),同样会因为时分秒的差异生成多个分组,导致重复结果。

如果你的需求还有特殊情况(比如同一天不同修改人需要保留多条),可以再细化你的需求,但上面的方法应该能覆盖绝大多数场景啦!

内容的提问来源于stack exchange,提问作者SJedi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:08:10