2012-07-24 109 views
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 

我試圖查詢每個學生的最高分數。plsql比較並獲得最大值

如果分數都相同(如「B」然後挑一個在底部。如果這是不可能的,只是挑不出什麼

我使用MAX()和最小不好受()和GROUP BY以獲得正確的結果 結果應該是這樣的

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

什麼是「底部」?表中沒有任何自然順序 – zerkms 2012-07-24 23:26:11

+0

其實我的意圖是......如果結果已經有'歷史',那麼可以選擇'數學'而不是'歷史'來得到下一個結果。但是,這似乎不可能在一個查詢 – sayhaha 2012-07-24 23:28:28

回答

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 
+0

gee ....... nius! – sayhaha 2012-07-24 23:47:03

+0

我知道OP沒有請求這個,但查詢不是確定的。可以通過簡單地添加句點並受到ORDER BY子句的限制來確定它。 – dbenham 2012-07-25 10:04:43

1

戈登的答案肯定奏效,並且它使用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)。