幾天前在CSDN回答別人的問題: SQL怎樣取得指定人的名次 ,現將結果招錄下來。
一、測試資料:
select A.* into #tmp_Mark from ( select id=1, myname='小明', mypass=123 union select id=2, myname='小花', mypass=122 union select id=3, myname='小東', mypass=111 union select id=4, myname='小牛', mypass=122 ) A
|
二、名次按mypass排列,依次遞增,mypass值相同時名次並列,即要求結果為:
| id |
myname
|
mypass
|
OrderNo |
1
|
小明 |
123 |
1 |
| 2 |
小花 |
122 |
2 |
| 3 |
小牛 |
122 |
2 |
| 4 |
小東 |
111 |
3 |
需要使用暫存資料表產生排序,使用以下語句:
select IDENTITY(int, 1,1) as OrderNo, mypass into #tmp_Order from #tmp_Mark group by mypass order by mypass desc --顯示結果 select B.*, A.OrderNo from #tmp_Order A,#tmp_Mark B where A.mypass=B.mypass order by A.OrderNo --如果只要單獨知道小花排序 select OrderNo from #tmp_Order A, #tmp_Mark B where A.mypass=B.mypass and B.myname='小花'
|
三、名次依mypass排列,mypass值相同名次並列,但計算排名,即:
| id |
mynam
|
mypass
|
OrderNo |
1
|
小明 |
123 |
1 |
| 2 |
小花 |
122 |
2 |
| 3 |
小牛 |
122 |
2 |
| 4 |
小東 |
111 |
4 |
這個稍為簡單,無需暫存資料表:
select A.*,myOrder=(select count(*) from #tmp_Mark where mypass>a.mypass)+1 from #tmp_Mark A order by myOrder |