2009年2月24日 星期二

自身Join排名取值技巧

以下是一個典型的分組排名,把A欄視為學生,B欄視為班別, C,D欄視為各科成績,
希望找出各班的排名, 或者找出指定名次的學生.

解題時,以B欄為群組的分類,並依據是C欄與D欄值的大小排名,名次其實就是找出比自己大的筆數再加上自己.

PS:這種邏輯下,可能出現兩個同分的第1名,而第2名.從缺的情況

資料表:T2
 
A B C D
--------------------
[1111] [1] [1] [1]
[2222] [1] [1] [2]
[3333] [2] [1] [1]
[4444] [2] [2] [1]
[5555] [2] [2] [2]
 
排名:以count(y.a)表示
 
select x.a
from t2 x, t2 y
where x.b = y.b and
( ((x.c < c="y.c">
OR
(x.a=y.a and x.b=y.b and x.c=y.c and x.d=y.d)
)
group by x.a, x.b, x.c, x.d
having count(y.a) = 1 --------> 只顯示排名為1的資料,
order by x.a, x.b, x.c, x.d
 
結果:
 
A
------
[2222]
[5555]


沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。