Sql 从表中查找多个最大值
我读过类似问题的答案,但我找不到解决我特定问题的方法 我将用一个简单的例子来说明我的问题 我有一个名为“奖品”的表格,有两列:员工和奖品 “员工”列列出员工的ID,奖励显示该员工赢得的单个奖励。如果一名员工赢得了多个奖项,他们的ID将与每个唯一的奖项一起列在表格的多行中 该表如下所示:Sql 从表中查找多个最大值,sql,database,oracle,Sql,Database,Oracle,我读过类似问题的答案,但我找不到解决我特定问题的方法 我将用一个简单的例子来说明我的问题 我有一个名为“奖品”的表格,有两列:员工和奖品 “员工”列列出员工的ID,奖励显示该员工赢得的单个奖励。如果一名员工赢得了多个奖项,他们的ID将与每个唯一的奖项一起列在表格的多行中 该表如下所示: Employee AWARD 1 Best dressed 1 Most attractive 2 Biggest time waster 1
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
如何更改查询以选择奖励最多的员工?您可以使用
densite\u 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
您可以使用
densite\u 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
表达这一点的一个简单方法是使用
rank()
或densed\u rank()
:
能够组合聚合函数和分析函数可以使这些查询更加简洁。表达这一点的简单方法是使用
rank()
或densed\u rank()
:
能够组合聚合函数和分析函数可以使这些查询更加简洁。这非常有效,谢谢。假设我也可以从select语句中删除“COUNT(*)AS num_awards”(计数(*)作为num_awards),因为它并没有真正的用处,这是否正确?编辑:在我的实际查询中,我只需要获得最多奖项的员工ID,而不需要他们实际获得了多少奖项。@Shiftz。您可以将计数(*)作为num_奖励删除。另外,只需
选择employee
。这非常有效,谢谢。假设我也可以从select语句中删除“COUNT(*)AS num_awards”(计数(*)作为num_awards),因为它并没有真正的用处,这是否正确?编辑:在我的实际查询中,我只需要获得最多奖项的员工ID,而不需要他们实际获得了多少奖项。@Shiftz。您可以将计数(*)作为num_奖励删除。另外,只需选择employee
。