gpt4 book ai didi

sql:如何删除重复行(内容相同,但顺序不同)

转载 作者:行者123 更新时间:2023-12-01 06:19:56 24 4
gpt4 key购买 nike

你看到SKU1有2行,其实这两行的内容是一样的,只是b和c的顺序不同罢了。

如果我想删除第二张图片中显示的重复行怎么办?

在Oracle中有一个LEAST/GREATEST函数可以实现它,但是我使用的是SQL Server,所以按照下面帖子的说明是行不通的:

How to remove duplicate rows in SQL

enter image description here

最佳答案

如果只有 2 列,顺序对分组依据无关紧要?

然后您可以使用 IIF(或 CASE WHEN)来计算最大值和最小值。
并在 GROUP BY 中使用这些计算值。

例如:

select Name, 
MAX(Val1) as Val1,
MIN(Val2) as Val2
from Table1
GROUP BY Name,
IIF(Val2 is null or Val1 < Val2, Val1, Val2),
IIF(Val1 is null or Val1 < Val2, Val2, Val1);

对于给出结果的示例记录:

Name Val1 Val2
SKU1 20 10
SKU2 20 10

或者如果你想使用一个奇特的 XML 技巧:

select Name, max(Val1) as Val1, min(Val2) as Val2
from (
select *,
cast(
convert(XML,
concat('<n>',Val1,'</n><n>',Val2,'</n>')
).query('for $n in /n order by $n return string($n)'
) as varchar(6)) as SortedValues
from Table1
) q
group by Name, SortedValues;

当涉及更多列时,最后一种方法可能更有用。

要真正删除重复项?
这是一个使用表变量来演示的示例:

declare @Table1 TABLE (Id int, Name varchar(20), Val1 int, Val2 int);

Insert Into @Table1 values
(1,'SKU1',10,20),
(2,'SKU1',20,10),
(3,'SKU1',12,15),
(4,'SKU2',10,null),
(5,'SKU2',null,10),
(6,'SKU2',10,20);

delete from @Table1
where Id in (
select Id
from (
select Id,
row_number() over (partition by Name,
IIF(Val2 is null or Val1 < Val2, Val1, Val2),
IIF(Val1 is null or Val1 < Val2, Val2, Val1)
order by Val1 desc, Val2 desc
) as rn
from @Table1
) q
where rn > 1
);

select * from @Table1;

关于sql:如何删除重复行(内容相同,但顺序不同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38518711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com