Sql server SQL Server-删除重复行-分区方式如何影响此查询?

Sql server SQL Server-删除重复行-分区方式如何影响此查询?,sql-server,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.St

我一直在使用下面的继承查询,试图删除重复的行,但在第一次将其作为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
有人能帮我确切地理解我在用这个分区的名称部分做什么吗?这不会以任何方式将查询限制为仅在名称字段中查找重复项,对吗?我需要确保它正在查找CTE定义中所有5个字段都相同的记录,以便将一条记录视为重复记录。

ROW\u NUMBER()OVER(按名称按顺序划分)
没有多大意义。您不会按
排序,因为它对分区中的所有内容都是相同的值,这使得
排序部分无用


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

然后,您需要将所有5个按
添加到
分区,因为您当前的查询只检查重复的
名称
。如果您想要预览,只需将
delete
更改为
select
。谢谢@SqlZim。我知道如何将其作为SELECT运行——这就是我所说的奇怪结果。我编辑了我的帖子,以便更清楚地了解这一点。感谢您提供的信息。将“分区依据”视为类似于“分组依据”可能会有所帮助-您可以为您分区依据的每组列获得不同的行号集。这很有意义@ZLK谢谢,蒂姆。非常好的措辞和容易理解。谢谢你。我已将其标记为答案。嘿@Tim,还有一个后续问题-你能给我一个例子,说明什么东西可以用来代替ORDER BY,以便更有意义吗?例如,如果你有一个记录创建日期,你想保留最旧的记录并删除较新的重复记录,你会使用
行号(按名称顺序按CreationDate划分)
这将为名称行编号1分配最早的记录,下一个最早的记录将是第2行,以此类推。外部查询删除除第1行以外的所有记录。