Microsoft SQL查询问题:无法删除30天前的重复行
问题分析与解决方案
你的查询未生效,核心问题出在两个地方:
- ROW_NUMBER排序逻辑错误:使用
ORDER BY (SELECT NULL)会让重复组内的行排名随机分配,你想要删除的旧数据(05-02-2023那行)大概率被分配为DupRank=1,导致DupRank>1的条件无法命中它。 - 日期比较的潜在风险:如果
dayTime字段是字符串类型(而非DATE/DATETIME),日期格式解析可能出错,导致dayTime < DATEADD(day, -30, GETDATE())的判断不符合预期。
修正后的查询语句
DELETE T FROM ( SELECT * , DupRank = ROW_NUMBER() OVER ( PARTITION BY id1, id2 ORDER BY dayTime DESC -- 按日期倒序,最新的行排名为1 ) FROM [dbo].[test] ) AS T WHERE DupRank > 1 -- 只删除重复组内的非最新行 AND dayTime < DATEADD(day, -30, GETDATE()) -- 且这些行日期超过30天
额外注意事项
- 确保
dayTime字段的数据类型是DATE或DATETIME,如果当前是字符串类型,建议先修改字段类型,或者在查询中显式转换(例如CONVERT(DATE, dayTime, 105),对应日-月-年格式),避免日期比较出错。 - 测试时可以先把
DELETE替换为SELECT *,查看哪些行会被选中,确认逻辑符合预期后再执行删除操作。
内容的提问来源于stack exchange,提问作者quango
相关产品推荐
相关产品推荐

