0
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() 和 group by 来获得正确的结果。结果应该是这样的

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

2 回答 2

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
于 2012-07-24T23:35:31.470 回答
1

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

Oracle 有一个我认为不是 ANSI 的附加语法,但它消除了对任何子查询的需要。它的性能至少与 Gordon 的回答一样好(它可能会稍微快一些,但我不确定)。它使用 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)。

于 2012-07-25T02:45:54.267 回答