从表格中查找多个最大值
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
【讨论】:
以上是关于从表格中查找多个最大值的主要内容,如果未能解决你的问题,请参考以下文章