【问题标题】:How to get the max value for each group in Oracle?如何获取 Oracle 中每个组的最大值?
【发布时间】:2017-04-17 21:33:13
【问题描述】:

我找到了一些解决这个问题的方法,但是,它们似乎不适用于 Oracle。

我知道了:

我希望视图仅显示每个团队中最年长的人的信息。所以,我的输出应该是这样的:

PERSON  | TEAM | AGE
Sam     | 1    | 23
Michael | 2    | 21

我如何在 Oracle 中做到这一点?

【问题讨论】:

    标签: sql oracle greatest-n-per-group


    【解决方案1】:
    select * from table
    where (team, age) in (select team, max(age) from table group by team)
    

    【讨论】:

    • 根据我的测试,这比这里建议的其他方法慢很多。
    【解决方案2】:

    一种方法使用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 效果很好。

    【讨论】:

    • 这个方法有效,但是有没有更简单的方法?老师从来没有教过我们“保持”
    • 我认为这是您在此处看到的所有答案中最简单的方法。但是FIRST 并不是那么广为人知。
    • 很好,但是当我添加更多行时,它会扩展。如何为我查询的这些行保留其他列?
    • @Peter.k 。 . .我建议您提出一个新的问题,其中包含适当的样本数据和所需的结果以及您想要做什么的解释。
    【解决方案3】:

    这是一个没有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;
    

    【讨论】:

      【解决方案4】:
      
      select * from (select person,team,age,
             dense_rank() over (partition by team order by age desc) rnk)
             where rnk=1;
      

      【讨论】:

      • 这里的子选择没有 from 子句。看起来无效。这不是您要查找的 select 语句。
      【解决方案5】:

      使用分析函数返回每个团队年龄最大的所有人(如果有相同年龄的人则需要),只选择一次表,因此比其他多次引用表的解决方案更快:

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-05
        • 2010-09-16
        • 1970-01-01
        • 2012-11-07
        • 2020-12-31
        • 1970-01-01
        • 2020-12-26
        相关资源
        最近更新 更多