仅根据少数列选择重复记录

时间:2012-03-10 07:55:29

标签: sql sql-server

我有一个包含3列的表格。它在第2列和第3列上有重复。我需要选择pnly重复行(包含所有3列)。怎么做?请帮帮我。

var1 var2 var3

a a a
b a a
c a a
d b b
e c c

以上是表格结构。它有3个columsn 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

除此之外,我如何在重复的条目中获得最高等级记录? 感谢。

4 个答案:

答案 0 :(得分:9)

如果您想要所有具有重复项的行,您可以使用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

答案 1 :(得分:0)

select var1,var2,var3 from vart where (var2+'#'+var3) in 
(
   select var2+'#'+var3 from vart group by var2,var3 having count(var1) > 1
)

答案 2 :(得分:0)

你的主要钥匙是什么?如果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
)

答案 3 :(得分:0)

使用您的查询,您可以使用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