从Oracle SQL中的每个组中选择具有最大值的行[重复]
Posted
技术标签:
【中文标题】从Oracle SQL中的每个组中选择具有最大值的行[重复]【英文标题】:Select row with max value from each group in Oracle SQL [duplicate] 【发布时间】:2021-07-30 12:15:11 【问题描述】:我有一张表people
,其中包含人们、他们的城市和他们的资金余额:
id city_id money
1 1 25
2 1 13
3 2 97
4 2 102
5 2 37
现在,我想从每个城市中选出最富有的人。如何使用 Oracle SQL 做到这一点?期望的结果是:
id city_id money
1 1 25
4 2 102
类似的东西会很有用:
SELECT * as tmp FROM people GROUP BY city_id HAVING money = MAX(money)
【问题讨论】:
【参考方案1】:您应该考虑“过滤”,而不是“聚合”,因为您想要整行。您可以使用子查询:
select p.*
from people p
where p.money = (select max(p2.money) from people p2 where p2.city_id = p.city_id);
【讨论】:
【参考方案2】:您可以通过city_id
(使用partition by
子句)和降序排序来使用DENSE_RANK()
解析函数money
在子查询中选择在主查询中等于 1 的返回值,以确定最富有的人,包括 ties(拥有相同每个城市的金额)例如
SELECT id, city_id, money
FROM( SELECT p.*,
DENSE_RANK() OVER ( PARTITION BY city_id ORDER BY money DESC ) AS dr
FROM people p )
WHERE dr = 1
【讨论】:
请再次查看@Yefet是否相同,并通过demo比较结果【参考方案3】:你可以使用RANK()
,因为它很灵活,你可以获得最富有或前N个最富有的人
SELECT
id, city_id, money
FROM (
SELECT
p.* ,RANK() OVER (PARTITION BY city_id ORDER BY money DESC ) as rank_per_city
FROM
people p )
WHERE
rank_per_city = 1
【讨论】:
以上是关于从Oracle SQL中的每个组中选择具有最大值的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章