从表格中查找多个最大值

Posted

技术标签:

【中文标题】从表格中查找多个最大值【英文标题】:Find multiple maximum values form a table 【发布时间】:2015-12-08 15:08:47 【问题描述】:

我已经阅读了类似问题的答案,但我找不到特定问题的解决方案。

我将用一个简单的例子来演示我的问题。

我有一个名为“Prizes”的表,其中包含两列:Employees 和 Awards

员工列列出了员工的 ID,奖励显示员工获得的单个奖励​​。如果员工赢得了多个奖项,他们的 ID 将与每个独特的奖项一起列在表格的多行中。

表格如下所示:

Employee      AWARD
    1     Best dressed
    1     Most attractive
    2     Biggest time waster
    1     Most talkative
    3     Hardest worker
    4     Most shady
    3     Most positive
    3     Heaviest drinker
    2     Most facebook friends

使用此表,我将如何选择获得最多奖项的员工的 ID?

输出应该是:

Employee
   1
   3

例如,这两名员工都获得了 3 个奖项

目前,下面的查询按降序输出员工 ID 以及他们获得的奖励数量:

SELECT employee,COUNT(*) AS num_awards
FROM prizes
GROUP BY employee
ORDER BY num_awards DESC;

会输出:

employee  num_awards
  1       3
  3       3
  2       2
  4       1

如何更改我的查询以选择获得最多奖项的员工?

【问题讨论】:

【参考方案1】:

表达这一点的简单方法是使用rank()dense_rank()

SELECT p.*
FROM (SELECT employee, COUNT(*) AS num_awards,
             RANK() OVER (ORDER BY COUNT(*) DESC) as seqnum
      FROM prizes
      GROUP BY employee
     ) p
WHERE seqnum = 1;

能够结合聚合函数和分析函数可以使这些查询更加简洁。

【讨论】:

这很好用,谢谢。假设我也可以从 select 语句中删除 'COUNT(*) AS num_awards' 因为它不是真的有用,我是否正确?编辑:在我的实际查询中,我只需要获得最多奖项的员工 ID,而不需要他们实际赢了多少。 @Shiftz 。 . .您可以删除count(*) as num_awards。另外,只需select employee【参考方案2】:

您可以使用dense_rank 获取所有计数最高的行。

with cnts as (
SELECT employee, count(*) cnt
FROM prizes
GROUP BY employee)
, ranks as (select employee, cnt, dense_rank() over(order by cnt desc) rnk 
            from cnts)
select employee, cnt 
from ranks where rnk = 1

【讨论】:

以上是关于从表格中查找多个最大值的主要内容,如果未能解决你的问题,请参考以下文章

cakephp 4 - 如何从相关表中查找最大值和最小值

从海量数据中查找出前k个最小或最大值的算法(java)

在python中查找多个组中的最大值

查找最大值比较每个索引的多个数组

从 pyspark 数据框中获取多个(100+)列的空计数、最小值和最大值的最佳方法

从查找表中获取每个类型和每个日期的最大 ID