SQL Server - 删除重复行 - 分区依据如何影响此查询?

时间:2017-08-22 22:03:25

标签: sql-server

我一直在使用以下继承的查询,我试图删除重复的行,并且在第一次作为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>

1 个答案:

答案 0 :(得分:1)

ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Name)没有多大意义。你不会ORDER BYPARTITION BY中使用相同的东西,因为它对于分区中的所有内容都是相同的值,使ORDER BY部分无效。

此查询的CTE部分基本上是将匹配的行(具有[Id] = 2170的行)临时拆分为每个不同名称的组,并且在每组具有相同名称的行中,按名称排序(这显然是所有相同的值)然后返回该序列组中的行号RN。唯一名称的行号都是1,因为只有一行具有该名称。重复的名称将包含行号1,2,3等。在这种情况下,由于愚蠢的ORDER BY子句,这些行的顺序是未定义的,但如果您将ORDER BY更改为有意义的内容,则行号将遵循该序列。