結果

2016-11-07 8 views
0

ソースデータ:私は(IDや評価が同じである)重複を見つける必要があり、また何らかの形で提示し、それらへの参照(CandidateID)を保つ結果

+-----+-------------+--------+---------+ 
| ID | CandidateID | Rating | Name | 
+-----+-------------+--------+---------+ 
| 777 |   119 |  5 | Fred | 
| 777 |   120 |  5 | Tony | 
| 777 |   121 |  3 | Ben  | 
| 888 |   131 |  4 | Joe  | 
| 888 |   132 |  4 | Matt | 
| 888 |   133 |  1 | Russell | 
+-----+-------------+--------+---------+ 

結果の表にその名前が表示されます。 所望の出力は、(唯一のIDと評価が同じである行を示す):

+-----+-------------+--------+------+ 
| ID | CandidateID | Rating | Name | 
+-----+-------------+--------+------+ 
| 777 |   119 |  5 | Fred | 
| 777 |   120 |  5 | Tony | 
| 888 |   131 |  4 | Joe | 
| 888 |   132 |  4 | Matt | 
+-----+-------------+--------+------+ 

私の初期のアプローチは、次いでCOUNT(*)> = 2を有し、か、COUNTを生成し、ID及び評価によってグループにありましたその結果のIDが存在するすべての行をリストします。悲しいことに、それは重複しない行も返します。より良い解決策はありますか?

+0

使用している実際のクエリを投稿できますか? –

答えて

1

1つの簡単な方法は、exists使用しています:あなたは、あなたのデータベースに基づいて

SELECT ID,CANDIDATEID,RATING,NAME 
FROM T 
QUALIFY COUNT(*)OVER(PARTITION BY ID,RATING)>=2 

、あなたがオーバー数(*)の構文を変更することができますだけでなく、このために解析関数を使用することができます

select t.* 
from t 
where exists (select 1 
       from t t2 
       where t2.id = t.id and t2.rating = t.rating and 
        t2.candidateid <> t.candidateid 
      ); 
+0

優れたソリューション。私のテーブルが実際に2つのテーブルを結合している場合に、どうすればそれを使うことができるかを提案してもらえますか?私は2回ジョイントする必要があります:最初にメインクエリの内側で 'EXISTS'句の中に入りますか? –

+0

@TonySepia。 。 。上記は標準SQLです。ほとんどのデータベースは共通テーブル式(CTE)をサポートしており、 'with'節が導入されています。その表現はあなたが非常に簡単にしたいものです。 –

+0

私はそれが標準SQLではないと主張しません。私はそれを使用したいものを成功させました。私の次の質問は、テーブル 't'が実際に2つのテーブルを結合している場合、それを使用するのが有効かどうかです。それから私は二度、参加していますよね?最初はメインクエリの内側にあり、次に 'EXISTS'句の内側にあります。 –

0

。この構文はteradataで機能します。

+0

これはTeradataの構文ですか? –

+0

@RaduGheorghiuyes –