2012-03-10 15 views
2

私は3つの列を持つテーブルを持っています。 2列目と3列目に重複しています。重複する行を3列すべて選択する必要があります。どうやってするか? plsは私を助けます。いくつかの列に基づいて重複レコードのみを選択してください

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

、私は重複したエントリ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

これは機能しました。ありがとうミカエル –

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」は、選択リストでは無効です。 –

+0

クエリを変更しました。しかし、それは少し非効率かもしれません。 IN句に複数のフィールドを入れる方法がわかりません –

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は主キーではありません。 –

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を使用してdupesを削除することができます。それは、集計関数または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 
関連する問題