【发布时间】:2017-04-17 21:33:13
【问题描述】:
我找到了一些解决这个问题的方法,但是,它们似乎不适用于 Oracle。
我知道了:
我希望视图仅显示每个团队中最年长的人的信息。所以,我的输出应该是这样的:
PERSON | TEAM | AGE
Sam | 1 | 23
Michael | 2 | 21
我如何在 Oracle 中做到这一点?
【问题讨论】:
标签: sql oracle greatest-n-per-group
我找到了一些解决这个问题的方法,但是,它们似乎不适用于 Oracle。
我知道了:
我希望视图仅显示每个团队中最年长的人的信息。所以,我的输出应该是这样的:
PERSON | TEAM | AGE
Sam | 1 | 23
Michael | 2 | 21
我如何在 Oracle 中做到这一点?
【问题讨论】:
标签: sql oracle greatest-n-per-group
select * from table
where (team, age) in (select team, max(age) from table group by team)
【讨论】:
一种方法使用keep:
select team, max(age) as age,
max(person) keep (dense_rank first order by age desc) as person
from t
group by team;
还有其他方法,但根据我的经验,keep 效果很好。
【讨论】:
这是一个没有keep 但有row_number() 的示例:
with t0 as
(
select person, team, age,
row_number() over(partition by team order by age desc) as rn
from t
)
select person, team, age
from t0
where rn = 1;
【讨论】:
select * from (select person,team,age,
dense_rank() over (partition by team order by age desc) rnk)
where rnk=1;
【讨论】:
使用分析函数返回每个团队年龄最大的所有人(如果有相同年龄的人则需要),只选择一次表,因此比其他多次引用表的解决方案更快:
With MaxAge as (
Select T.*, Max (Age) Over (Partition by Team) MaxAge
From Table T
)
Select Person, Team, Age From MaxAge Where Age=MaxAge
;
这也适用于 MySQL/MariaDB。
【讨论】: