根据组和计数结果返回额外的列

时间:2016-11-07 13:21:40

标签: sql group-by duplicates

来源数据:

+-----+-------------+--------+---------+
| 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的所有行。遗憾的是,这也会返回非重复的行。有更好的解决方案吗?

2 个答案:

答案 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。