日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 怎么实现组内排名_MySQL 实现排名(分组排名)

發布時間:2025/3/15 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 怎么实现组内排名_MySQL 实现排名(分组排名) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在MYSQL的最新版本MYSQL8已經支持了排名函數RANK,DENSE_RANK和ROW_NUMBER。但是在5.*版本中還不支持這些函數,只能自己實現。實現方法主要用到了條件判斷語句(CASE WHEN或IF)和添加臨時變量。

基本知識:

sql語句中,使用@來定義一個變量。如:@abc

sql語句中,使用:=來給變量賦值,:@abc:=123,則變量abc的值為123

sql語句中,if(A,B,C)表示,如果A條件成立,那么執行B,否則執行C,如:@abc := if(2>1,100,200)的結果是,abc的值為100。

一、排名分類:

1.1 區別RANK,DENSE_RANK和ROW_NUMBER

RANK并列跳躍排名:,并列即相同的值,相同的值保留重復名次,遇到下一個不同值時,跳躍到總共的排名。

DENSE_RANK并列連續排序:,并列即相同的值,相同的值保留重復名次,遇到下一個不同值時,依然按照連續數字排名。

ROW_NUMBER連續排名:,即使相同的值,依舊按照連續數字進行排名。

二、數據準備:

創建一張分數表,里面有字段:分數score,課程號course_id和學生號student_id。執行如下SQL語句,進行導入數據。

create table score(

student_id varchar(10),

course_id varchar(10),

score decimal(18,1)

);

?

insert into score values('01' , '01' , 80);

insert into score values('01' , '02' , 90);

insert into score values('01' , '03' , 99);

insert into score values('02' , '01' , 70);

insert into score values('02' , '02' , 60);

insert into score values('02' , '03' , 80);

insert into score values('03' , '01' , 80);

insert into score values('03' , '02' , 80);

insert into score values('03' , '03' , 80);

insert into score values('04' , '01' , 50);

insert into score values('04' , '02' , 30);

insert into score values('04' , '03' , 20);

insert into score values('05' , '01' , 76);

insert into score values('05' , '02' , 87);

insert into score values('06' , '01' , 31);

insert into score values('06' , '03' , 34);

insert into score values('07' , '02' , 89);

insert into score values('07' , '03' , 98);

insert into score values('08' , '02' , 89);

insert into score values('09' , '02' , 89);

三、不分組排名

3.1 連續排名:

使用ROW_NUMBER實現:

>SELECT score,

ROW_NUMBER() OVER (ORDER BY score DESC) ranking

FROM score;

使用變量實現:

SELECT

s.score,(@cur_rank := @cur_rank + 1) AS Rank

FROM score s,(SELECT @cur_rank := 0) r

ORDER BY s.score DESC

3.2 并列跳躍排名

使用RANK實現:

SELECT course_id, score,

RANK() OVER(ORDER BY score DESC)

FROM score;

使用變量和IF語句實現:

SELECT s.score ,

@cur_count := @cur_count + 1,

if(@pre_score = s.score,@cur_rank,@cur_rank := @cur_count) ranking,

@pre_score := s.score

FROM score s,(SELECT @cur_count := 0,@cur_rank:=0,@pre_score := NULL) t

ORDER BY s.score DESC

Result1

使用變量和CASE來實現:

SELECT s.score,

@cur_count := @cur_count + 1,

(

case

when @pre_score = s.score then @cur_rank

when @pre_score := s.score then @cur_rank := @cur_count

END

) ranking,

@pre_score := s.score

FROM score s,(SELECT @cur_count := 0,@cur_rank := 0,@pre_score := NULL) r

ORDER BY s.score DESC ;

3.3 并列連續排名

使用DENSE_RANK實現:

SELECT course_id, score,

DENSE_RANK() OVER(ORDER BY score DESC) FROM score;

使用變量和IF語句實現:

SELECT

s.score,

@cur_rank := @cur_rank + 1 ranking

FROM SCORE s,(SELECT @pre_score := NULL ,@cur_rank := 0) r

ORDER BY s.score DESC ;

使用變量和CASE語句實現:

SELECT

s.score,

case

when @pre_score = score then @cur_rank

when @pre_score := score then @cur_rank := @cur_rank + 1 END ranking

FROM SCORE s,(SELECT @pre_score := NULL ,@cur_rank := 0) r

ORDER BY s.score DESC ;

四、分組排名

4.1 分組連續排名

使用ROW_NUMBER實現:

SELECT

course_id,

score,

ROW_NUMBER() OVER (PARTITION BY course_id ORDER BY score DESC) ranking

FROM score;

使用變量和IF實現:

SELECT

s.course_id,

s.score,

if(@pre_course_id = s.course_id,@cur_rank := @cur_rank + 1 ,@cur_rank := 1) ranking,

@pre_course_id := s.course_id

FROM score s,(SELECT @cur_rank := 0 ,@pre_course_id := NULL) r

ORDER BY s.course_id,s.score DESC ;

使用變量和CASE實現:

SELECT

s.course_id,

s.score,

(

case

when @pre_course_id = s.course_id then @cur_rank := @cur_rank + 1

when @pre_course_id := s.course_id then @cur_rank := 1 end

) ranking

FROM score s ,(SELECT @cur_rank := 0 ,@pre_course_id := NULL) r

ORDER BY s.course_id,s.score DESC

Result

4.2 分組并列跳躍排名

使用RANK實現:

SELECT course_id, score,

RANK() OVER(PARTITION BY course_id ORDER BY score DESC)

FROM score;

使用變量和IF語句實現:

SELECT s.course_id, s.score,

IF(@pre_course_id = s.course_id,

@rank_counter := @rank_counter + 1,

@rank_counter := 1) temp1,

IF(@pre_course_id = s.course_id,

IF(@pre_score = s.score, @cur_rank, @cur_rank := @rank_counter),

@cur_rank := 1) ranking,

@pre_score := s.score temp2,

@pre_course_id := s.course_id temp3

FROM score s, (SELECT @cur_rank := 0, @pre_course_id := NULL, @pre_score := NULL, @rank_counter := 1)r

ORDER BY s.course_id, s.score DESC;

4.3 分組并列連續排名

使用DENSE_RANK實現:

SELECT course_id, score,

DENSE_RANK() OVER(PARTITION BY course_id ORDER BY score DESC)

FROM score;

使用變量和IF語句實現:

SELECT

s.course_id,

s.score,

IF(@pre_course_id = s.course_id,

IF(@pre_score = s.score, @cur_rank, @cur_rank := @cur_rank + 1),

@cur_rank := 1) ranking,

@pre_score := s.score,

@pre_course_id := s.course_id

FROM score s, (SELECT @cur_rank :=0, @pre_score = NULL, @pre_course_id := NULL) r

ORDER BY course_id, score DESC;

可以將上述的IF條件提取出來:

SELECT

s.course_id,

s.score,

IF(@pre_score = s.score, @cur_rank, @cur_rank := @cur_rank + 1) temp1,

@pre_score := s.score temp2,

IF(@pre_course_id = s.course_id, @cur_rank, @cur_rank := 1) ranking,

@pre_course_id := s.course_id

FROM score s, (SELECT @cur_rank :=0, @pre_score = NULL, @pre_course_id := NULL) r

ORDER BY course_id, score DESC;

參考:https://blog.csdn.net/u011726005/article/details/94592866

總結

以上是生活随笔為你收集整理的mysql 怎么实现组内排名_MySQL 实现排名(分组排名)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。