从表中查找多个最大值

时间:2015-12-08 15:08:47

标签: sql database oracle

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

我将用一个简单的例子来证明我的问题。

我有一张名为'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

如何更改查询以选择奖励最多的员工?

2 个答案:

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

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