【问题标题】:return extra columns based on group and count results根据组和计数结果返回额外的列
【发布时间】:2016-11-07 13:21:39
【问题描述】:

来源数据:

+-----+-------------+--------+---------+
| 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 和 Rating 相同),但还要以某种方式保留对它们的引用 (CandidateID) 以在结果表中显示它们的名称。 期望的输出(仅显示 ID AND Rating 相同的行):

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

我最初的方法是按 ID 和评级进行 GROUP,生成 COUNT,然后执行 HAVING COUNT(*) >= 2,然后列出该结果中存在 ID 的所有行。可悲的是,这也返回非重复行。有没有更好的解决方案?

【问题讨论】:

  • 您可以发布您正在使用的实际查询吗?

标签: sql group-by duplicates


【解决方案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
             );

【讨论】:

  • 优秀的解决方案。如果我的表 t 实际上是两个表的连接,您是否愿意建议我如何使用它?我应该进行两次连接:首先在主查询中,然后在“EXISTS”子句中?
  • @TonySepia 。 . .以上是标准SQL。大多数数据库支持公用表表达式 (CTE),通过 with 子句引入。那个表达你想要什么很容易。
  • 我不认为它不是标准 SQL。我已经成功地使用它实现了我想要的。我的下一个问题是使用它是否有效,如果我的表“t”实际上是两个表的连接?然后我要加入两次,对吧?首先在主查询中,然后在“EXISTS”子句中。
  • @TonySepia 。 . .这取决于查询的结构和您使用的数据库。不同的数据库有不同的优化器。
【解决方案2】:

您也可以为此使用分析功能

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

根据您的数据库,您可以更改 count(*) over 的语法。此语法适用于 teradata。

【讨论】:

  • 那么,这是 Teradata 语法吗?
  • @RaduGheorghiuyes
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 2013-01-29
相关资源
最近更新 更多