Sql排名和分組排名

2022-04-22 03:10:50 字數 3063 閱讀 3781

在很多時候,都有排名這個功能,比如排行榜,並且還需要分頁的功能,一般可以再select的時候按照某一字段 oorder by xx desc,這樣limit 查詢就可以得到排名資訊,但是有時候是需要多表連線,或者是有乙個隨機檢視,在頁面上並不是按照排名公升降序。這個時候就需要用sql來實現排名。

先準備測試資料:

table: 

create

table

`test` (

`score`

int(255) not

null

, `name`

varchar(255) not

null

, `type`

varchar(255) not

null

) engine

=innodb default charset=

utf8; --

----------------------------

--records of test

------------------------------

insert

into `test` values ('

79', '

張三', '數學'

);insert

into `test` values ('

69', '

張三', '語文'

);insert

into `test` values ('

57', '

張三', '英語'

);insert

into `test` values ('

81', '

李四', '數學'

);insert

into `test` values ('

45', '

李四', '語文'

);insert

into `test` values ('

84', '

李四', '英語'

);insert

into `test` values ('

15', '

王五', '數學'

);insert

into `test` values ('

47', '

王五', '

語文');

如果要查詢數學科目的排名,可以用以下sql語句:

select a.*,@a :=@a+

1as rank from test a,(select

@a:=

0) b where type=

'數學

'order

by a.score desc;

結果如下:

也就是使用a變數,按照order by的順序遞增。這個很好理解,但是如果有分組排序的需求呢?

例如在test表中,要用一條sql查出數學、語文、英語三個科目各自的排名呢?

首先可以想到方法還是類似查詢單科排名,先將所有記錄按照科目、得分排序,order by type,score。然後自定義變數遞增,但是關鍵就在於需要判斷科目的記錄有多少條,也即自定義變數歸零重新遞增的臨界點。

簡單排名使用乙個變數a,那麼在分組排序中可以考慮使用兩個變數,a、b

先執行如下sql

select a.*

from test a order

by type,score;

現在加上排名,先使用乙個變數看得到什麼效果:

現在排名並沒有按照科目的不同重新計算,我們只要解決排名何時歸0,就可以得到分組排序的結果了。

再加乙個中間變數nowtype試試?讓這個中間變數nowtype等於type(科目),只要下一條記錄與這個中間變數nowtype相等,rank就加1,不相等的話,rank就歸零,來看下這條sql:

select a.*,@lasttype :=

@nowtype,@ nowtype:= a.type,if(@lasttype

=@nowtype,@rank:=

@rank

+1,@rank :=

0) as rank from test a,(select

@a :=

0,@ nowtype:=

0,@rank :=

0) b order

by type,score;

現在看來是不是比較簡單了,lasttype用於記錄上一條記錄的type,nowtype是當前記錄的type,只要nowtype=lasttype,就說明是同一科目,rank加+,反之,rank歸零。

但是我們看到同樣是將rank初始化為0,為什麼上面是從1開始,而這次是從0開始呢?再分析下sql,在第一條記錄的時候,lasttype=0.而nowtype=數學,肯定不相等,所以輸出0,rank從0開始,只要將rank初始化為1就好了。

select a.*,@lasttype :=

@temp,@temp := a.type,if(@lasttype

=@temp,@rank:=

@rank

+1,@rank :=

1) as rank from test a,(select

@a :=

0,@temp :=

0,@rank :=

0) b order

by type,score;

sql分組排名

資料庫teradata 班級科目成績表 create multiset table pd portal.aaa no fallback no before journal,no after journal,checksum default banji varchar 40 character set...

mysql分組排名 mysql分組排名

1.建立表並寫入測試資料 create table tb rank score city varchar 20 score int insert into tb rank score values sz 89 insert into tb rank score values sz 76 insert...

sql 分組後 組內排名

語法 row number over partition by column order by column 簡單的說row number 從1開始,為每一條分組記錄返回乙個數字,這裡的row number over order by xlh desc 是先把xlh列降序,再為降序以後的沒條xlh記...