2012-03-10 78 views
2

我有一個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

除了這個,我怎麼能得到最大等級記錄amoung重複的條目? 謝謝。

回答

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 
+0

這工作。謝謝Mikael – 2012-03-10 10:34:45

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

列「vart.var1」在選擇列表中無效。 – 2012-03-10 08:12:07

+0

已修改查詢。雖然這可能有點低效。我不知道如何在IN子句中有多個字段 – 2012-03-10 08:34:55

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 
) 
+0

var 1不是主鍵。 – 2012-03-10 08:12:36

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太刪除受騙者:因爲它不是在聚合函數或GROUP BY子句中包含

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