我正在尝试编写一些SQL来自动从数据库中删除一些记录,但我在使用逻辑时遇到了一些问题,并希望看看是否有人可以帮我解决这个问题。
基本上我有一张名为image的表。在图像中,有一列主ID,辅助ID,类型,年份和日期。
主ID可能具有多个辅助ID,因此这意味着具有不同辅助ID的相同主ID的多行。每个辅助ID肯定会有两行,一种是小型的,一种是大型的。一些辅助ID具有重复数据,因此可能有6行(选择任意数字),这意味着对于单个主ID,单个辅助ID重复3次小型和大型中的一种。所有这些都可以是一年,然后在明年重复。
这很难掌握,所以让我创建一些数据的可视化示例。我不擅长格式化,所以数据行顺序就像我在上面输入的那样,主要ID,辅助ID,类型,年份和日期。
EX:
1000 3000 Small 2010 2010-11-28
1000 3000 Large 2010 2010-11-28
1000 3000 Small 2010 2010-11-29
1000 3000 Large 2010 2010-11-29
1000 3000 Small 2011 2010-11-30
1000 3000 Large 2011 2010-11-30
1000 3001 Small 2010 2010-11-28
1000 3001 Large 2010 2010-11-28
1000 3001 Small 2010 2010-11-28
1000 3001 Large 2010 2010-11-28
1000 3001 Small 2011 2010-11-28
1000 3001 Large 2011 2010-11-28
您可以看到,具有相同日期和年份的单个辅助ID可能存在重复数据。即使日期是休息日或只是不同,也有基于相同的二级ID和年份可能重复的数据。
基本上我需要的是一个查询,它将遍历一个填充了这样的数据的表,并删除不需要的错误记录。
对于此图像表中的每个主要ID,我希望每年(不是日期)的每个辅助ID只有两个记录,分别为小和大,保持最新的日期。
例如,我希望在运行此脚本后保留这些记录:
1000 3000 Small 2010 2010-11-29
1000 3000 Large 2010 2010-11-29
1000 3000 Small 2011 2010-11-30
1000 3000 Large 2011 2010-11-30
1000 3001 Small 2010 2010-11-28
1000 3001 Large 2010 2010-11-28
1000 3001 Small 2011 2010-11-28
1000 3001 Large 2011 2010-11-28
同样,这只是一个主要ID和一些辅助ID的示例,此表中可能有x个主要ID。
如何编写一个查询,删除此示例中定义的此图像表中的额外行?
答案 0 :(得分:3)
WITH cteRowNums AS (
SELECT MainId, SecondaryId, Type, Year, DateColumn,
ROW_NUMBER() OVER(PARTITION BY MainId, SecondaryId, Type, Year ORDER BY DateColumn DESC) AS RowNum
FROM image
)
DELETE FROM cteRowNums
WHERE RowNum <> 1;