Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除具有重复Col1的行,同时考虑删除Col2中具有最高值的行_Sql_Sql Server - Fatal编程技术网

Sql 删除具有重复Col1的行,同时考虑删除Col2中具有最高值的行

Sql 删除具有重复Col1的行,同时考虑删除Col2中具有最高值的行,sql,sql-server,Sql,Sql Server,我有一张桌子,应该有唯一的钥匙。我根据另一个键(Col1)的唯一性生成一个键(Col2)。现在,发生了一些事情,我在Col2中有唯一的键,但是一些数据在Col1中重复。例如,我们有 我想自动删除值为DB02的行,DB01保留。因为02比01大,我想保留最小的值(尽管它包含字符) 你能帮我查询一下吗 以下是我尝试的查询的图片,以及我没有得到的结果:( 您可以使用CTE执行删除操作: ;WITH ToDelete AS ( SELECT ROW_NUMBER() OVER (PARTITIO

我有一张桌子,应该有唯一的钥匙。我根据另一个键(Col1)的唯一性生成一个键(Col2)。现在,发生了一些事情,我在Col2中有唯一的键,但是一些数据在Col1中重复。例如,我们有

我想自动删除值为DB02的行,DB01保留。因为02比01大,我想保留最小的值(尽管它包含字符)

你能帮我查询一下吗

以下是我尝试的查询的图片,以及我没有得到的结果:(


您可以使用
CTE
执行
删除操作

;WITH ToDelete AS (
   SELECT ROW_NUMBER() OVER (PARTITION BY Col2 ORDER BY Col1) AS rn
   FROM mytable
)
DELETE FROM ToDelete
WHERE rn > 1

ROW\u NUMBER
窗口函数用于枚举每个
Col2
分区内的记录。具有最低
Col1
值的记录被分配一个
rn=1
值。所有其他记录都具有
rn>1
并被删除。

您可以使用
CTE
执行
删除

;WITH ToDelete AS (
   SELECT ROW_NUMBER() OVER (PARTITION BY Col2 ORDER BY Col1) AS rn
   FROM mytable
)
DELETE FROM ToDelete
WHERE rn > 1

ROW\u NUMBER
窗口函数用于枚举每个
Col2
分区内的记录。具有最低
Col1
值的记录被分配一个
rn=1
值。所有其他记录都具有
rn>1
并被删除。

答案与Giorgos Betsos的建议类似,但代码应如下所示:

WITH ToDelete AS (
   SELECT Col2 ,ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col1) AS rn
   FROM mytable
)
DELETE FROM ToDelete
WHERE rn > 1

答案与Giorgos Betsos的建议类似,但代码应如下所示:

WITH ToDelete AS (
   SELECT Col2 ,ROW_NUMBER() OVER (PARTITION BY Col1 ORDER BY Col1) AS rn
   FROM mytable
)
DELETE FROM ToDelete
WHERE rn > 1

谢谢,你能稍微修改一下代码吗。它会保留第一个值吗?这一行:选择ROW_NUMBER()OVER(按Col2分区按Col1排序)正如mytable中的rn返回一个所有值都是1的表,它返回所有值wrong@yousefyegane否,我解释了
rn
值的取值。我执行select查询,它返回62403条记录,其中所有记录的列rn都是1,当我执行count(*)时它返回62403。这意味着所有记录都被认为是唯一的。我对结果有点困惑。它是否应该返回一些值大于1的rn?我使用count和group by,可以找到重复的记录。我还更改了Col1和Col2的位置,但结果没有什么不同。@yousefyegane好的,我这样做了,我得到了几条记录(实际上是9条记录)有
rn=2
。谢谢,你能稍微修改一下代码吗。它会保留第一个值吗?这一行:选择行数()(按Col2划分,按Col1排序)正如mytable中的rn返回一个所有值都是1的表,它返回所有值wrong@yousefyegane否,我解释了
rn
值的取值。我执行select查询,它返回62403条记录,其中所有记录的列rn都是1,当我执行count(*)时它返回62403。这意味着所有记录都被认为是唯一的。我对结果有点困惑。它是否应该返回一些值大于1的rn?我使用count和group by,可以找到重复的记录。我还更改了Col1和Col2的位置,但结果没有什么不同。@yousefyegane好的,我这样做了,我得到了几条记录(实际上是9条记录)具有
rn=2