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
答案 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)。