我一直在使用以下继承的查询,我试图删除重复的行,并且在第一次作为SELECT运行时我得到一些意想不到的结果 - 我相信它有事情要做由于我对声明的分区部分缺乏了解:
WITH CTE AS(
SELECT [Id],
[Url],
[Identifier],
[Name],
[Entity],
[DOB],
RN = ROW_NUMBER()OVER(PARTITION BY Name ORDER BY Name)
FROM Data.Statistics
where Id = 2170
)
DELETE FROM CTE WHERE RN > 1
有人可以帮我理解我在分区BY Name中做了什么吗?这并不以任何方式限制查询只在“名称”字段中查找重复项,对吗?我需要确保它正在查找记录,其中CTE定义内的字段的 所有5 对于记录被视为重复的记录是相同的。< / p>
答案 0 :(得分:1)
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Name)
没有多大意义。你不会ORDER BY
在PARTITION BY
中使用相同的东西,因为它对于分区中的所有内容都是相同的值,使ORDER BY
部分无效。
此查询的CTE部分基本上是将匹配的行(具有[Id] = 2170的行)临时拆分为每个不同名称的组,并且在每组具有相同名称的行中,按名称排序(这显然是所有相同的值)然后返回该序列组中的行号RN
。唯一名称的行号都是1,因为只有一行具有该名称。重复的名称将包含行号1,2,3等。在这种情况下,由于愚蠢的ORDER BY
子句,这些行的顺序是未定义的,但如果您将ORDER BY
更改为有意义的内容,则行号将遵循该序列。