我有一个有3列的表。它在第2列和第3列有重复项。我需要选择所有重复的行(所有3列)。如何做到这一点?请帮帮我。
var1 var2 var3
a a a
b a a
c a a
d b b
e c c
以上是表格结构。它有3列var1、var2、var3。仅基于var2和var3列,我们不得不假设它是重复的记录。在查找重复项时,我们不应该考虑var1。很抱歉对齐。
我已经使用下面的查询来获取所有有/没有重复的行,但具有标识重复记录的级别。但我不能只得到重复的记录。
select var1,var2,var3,ROW_NUMBER() over(PARTITION BY
var2,var3 order by var2,var3) as rnk
from vart
除此之外,如何获得重复条目的最高排名记录?谢谢
如果您想要所有具有重复的行,可以使用count(*) over()
select var1, var2, var3
from (
select var1,
var2,
var3,
count(*) over(partition by var2, var3) as dc
from YourTable
) as T
where dc > 1
结果:
var1 var2 var3
---- ---- ----
a a a
b a a
c a a
如果您想要除一个之外的所有重复项,请使用row_number() over()
。
select var1, var2, var3
from (
select var1,
var2,
var3,
row_number() over(partition by var2, var3 order by var1) as rn
from YourTable
) as T
where rn > 1
结果:
var1 var2 var3
---- ---- ----
b a a
c a a
您的主键是什么?如果var1为,请尝试:
select var1
from vart
group by var2+var3
having count(*)>1
如果不是,请尝试:
select * from vart where pk in
(
select pk
from vart
group by var2+var3
having count(*)>1
)
select var1,var2,var3 from vart where (var2+'#'+var3) in
(
select var2+'#'+var3 from vart group by var2,var3 having count(var1) > 1
)
使用您的查询,您可以用CTE扩展它,并执行您想要的
with cte as
(
select var1,var2,var3,ROW_NUMBER() over(PARTITION BY var2,var3 order by var2,var3) as rnk from vart
)
select * from cte where rnk > 1
这将列出所有"重复"的行。
您也可以使用cte删除重复数据:
with cte as
(
select ROW_NUMBER() over(PARTITION BY var2,var3 order by var2,var3) as rnk from vart
)
delete from cte where rnk > 1