来源数据:
+-----+-------------+--------+---------+
| 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和评级相同),但也以某种方式保留对它们的引用(CandidateID)以在结果表中显示它们的名称。 期望的输出(仅显示ID和评级相同的行):
+-----+-------------+--------+------+
| ID | CandidateID | Rating | Name |
+-----+-------------+--------+------+
| 777 | 119 | 5 | Fred |
| 777 | 120 | 5 | Tony |
| 888 | 131 | 4 | Joe |
| 888 | 132 | 4 | Matt |
+-----+-------------+--------+------+
我的初始方法是按ID和评分进行分组,生成COUNT,然后执行HUNT COUNT(*)> = 2,然后列出存在该结果的ID的所有行。遗憾的是,这也会返回非重复的行。有更好的解决方案吗?
答案 0 :(得分:1)
一种简单的方法是使用exists
:
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
);
答案 1 :(得分:0)
您也可以使用分析功能
SELECT ID,CANDIDATEID,RATING,NAME
FROM T
QUALIFY COUNT(*)OVER(PARTITION BY ID,RATING)>=2
根据您的数据库,您可以更改count(*)的语法。此语法适用于teradata。