我已经阅读了类似问题的答案,但我无法找到解决我特定问题的方法。
我将用一个简单的例子来证明我的问题。
我有一张名为'Prizes'的表格,其中有两列:员工和奖励
员工列列出员工的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
使用此表格,我如何选择获奖最多的员工的身份证?
输出应为:
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
如何更改查询以选择奖励最多的员工?
答案 0 :(得分:3)
您可以使用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
答案 1 :(得分:3)
表达此问题的一种简单方法是使用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;
能够组合聚合函数和分析函数可以使这些查询更加简洁。