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