plsql比较并获得最大值

时间:2012-07-24 23:24:41

标签: sql plsql group-by max

Student    Subj   Period  Score
-------------------------
A          Math   100        50
A          Hist   100        100
A          Sci    200        70
B          Math   100        50
B          Hist   100        50

我正在尝试查询每个学生的最高分。

如果分数全部相同(例如'B',则在底部选择一个。如果不可能,只选择任何

我很难使用max()和min()以及分组来获得正确的结果。 结果应该如下所示

Student    Subj   Period    Score
-------------------------
A          Hist   100       100
B          Hist   100       50

2 个答案:

答案 0 :(得分:2)

您想使用分析函数(我假设这是在Oracle中提到的pl / sql):

select Student, Subj, Period, Score
from (select t.*,
             row_number() over (partition by student order by score desc) as seqnum
      from t
     ) t
where seqnum = 1

答案 1 :(得分:1)

Gordon的答案当然非常有效,它使用了许多数据库引擎支持的ANSI语法。

Oracle有一个我认为不是ANSI的附加语法,但它不需要任何子查询。它的表现至少和戈登的答案一样好(可能会稍微快些,但我不确定)。它使用KEEP LAST扩展来聚合函数。

select student,
       max(subj)   keep( dense_rank last order by score, period ) as subj,
       max(period) keep( dense_rank last order by score, period ) as period,
       max(score) as score
  from grades
 group by student
;

注意 - 除非您明确要提供随机结果,否则应始终构建查询以提供确定的答案,这意味着无论数据的加载方式如何,给定的数据集始终会给出相同的答案。我将上述查询按最高分排序,然后是最高分。如果仍然存在平局,则返回max(subj)。