工作场景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
相关产品推荐
相关产品推荐

