国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

總結幾種MySQL中常見的排名問題

瀏覽:81日期:2023-10-12 08:09:16

前言:

在某些應用場景中,我們經常會遇到一些排名的問題,比如按成績或年齡排名。排名也有多種排名方式,如直接排名、分組排名,排名有間隔或排名無間隔等等,這篇文章將總結幾種MySQL中常見的排名問題。

創建測試表

create table scores_tb ( id int auto_increment primary key, xuehao int not null, score int not null) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into scores_tb (xuehao,score) values (1001,89),(1002,99),(1003,96),(1004,96),(1005,92),(1006,90),(1007,90),(1008,94);# 查看下插入的數據mysql> select * from scores_tb;+----+--------+-------+| id | xuehao | score |+----+--------+-------+| 1 | 1001 | 89 || 2 | 1002 | 99 || 3 | 1003 | 96 || 4 | 1004 | 96 || 5 | 1005 | 92 || 6 | 1006 | 90 || 7 | 1007 | 90 || 8 | 1008 | 94 |+----+--------+-------+

1.普通排名

按分數高低直接排名,從1開始,往下排,類似于row number。下面我們給出查詢語句及排名結果。

# 查詢語句SELECT xuehao, score, @curRank := @curRank + 1 AS rankFROM scores_tb, (SELECT @curRank := 0) rORDER BY score desc;# 排序結果+--------+-------+------+| xuehao | score | rank |+--------+-------+------+| 1002 | 99 | 1 || 1003 | 96 | 2 || 1004 | 96 | 3 || 1008 | 94 | 4 || 1005 | 92 | 5 || 1006 | 90 | 6 || 1007 | 90 | 7 || 1001 | 89 | 8 |+--------+-------+------+

上述查詢語句中,我們申明了一個變量 @curRank ,并將此變量初始化為0,查得一行將此變量加一,并以此作為排名。我們看到這類排名是沒間隔的并且有些分數相同但排名不同。

2.分數相同,名次相同,排名無間隔

# 查詢語句SELECT xuehao, score, CASEWHEN @prevRank = score THEN @curRankWHEN @prevRank := score THEN @curRank := @curRank + 1END AS rankFROM scores_tb, (SELECT @curRank :=0, @prevRank := NULL) rORDER BY score desc;# 排名結果+--------+-------+------+| xuehao | score | rank |+--------+-------+------+| 1002 | 99 | 1 || 1003 | 96 | 2 || 1004 | 96 | 2 || 1008 | 94 | 3 || 1005 | 92 | 4 || 1006 | 90 | 5 || 1007 | 90 | 5 || 1001 | 89 | 6 |+--------+-------+------+

3.并列排名,排名有間隔

另外一種排名方式是相同的值排名相同,相同值的下一個名次應該是跳躍整數值,即排名有間隔。

# 查詢語句SELECT xuehao, score, rank FROM(SELECT xuehao, score,@curRank := IF(@prevRank = score, @curRank, @incRank) AS rank, @incRank := @incRank + 1, @prevRank := scoreFROM scores_tb, (SELECT @curRank :=0, @prevRank := NULL, @incRank := 1) rORDER BY score desc) s;# 排名結果+--------+-------+------+| xuehao | score | rank |+--------+-------+------+| 1002 | 99 | 1 || 1003 | 96 | 2 || 1004 | 96 | 2 || 1008 | 94 | 4 || 1005 | 92 | 5 || 1006 | 90 | 6 || 1007 | 90 | 6 || 1001 | 89 | 8 |+--------+-------+------+

上面介紹了三種排名方式,實現起來還是比較復雜的。好在MySQL8.0增加了窗口函數,使用內置函數可以輕松實現上述排名。

MySQL8.0 利用窗口函數實現排名

MySQL8.0中可以利用 ROW_NUMBER(),DENSE_RANK(),RANK() 三個窗口函數實現上述三種排名,需要注意的一點是as后的別名,千萬不要與前面的函數名重名,否則會報錯,下面給出這三種函數實現排名的案例:

# 三條語句對于上面三種排名select xuehao,score, ROW_NUMBER() OVER(order by score desc) as row_r from scores_tb;select xuehao,score, DENSE_RANK() OVER(order by score desc) as dense_r from scores_tb;select xuehao,score, RANK() over(order by score desc) as r from scores_tb;# 一條語句也可以查詢出不同排名SELECT xuehao,score, ROW_NUMBER() OVER w AS ’row_r’, DENSE_RANK() OVER w AS ’dense_r’, RANK() OVER w AS ’r’FROM `scores_tb`WINDOW w AS (ORDER BY `score` desc);# 排名結果+--------+-------+-------+---------+---+| xuehao | score | row_r | dense_r | r |+--------+-------+-------+---------+---+| 1002 | 99 | 1 | 1 | 1 || 1003 | 96 | 2 | 2 | 2 || 1004 | 96 | 3 | 2 | 2 || 1008 | 94 | 4 | 3 | 4 || 1005 | 92 | 5 | 4 | 5 || 1006 | 90 | 6 | 5 | 6 || 1007 | 90 | 7 | 5 | 6 || 1001 | 89 | 8 | 6 | 8 |+--------+-------+-------+---------+---+

總結:

本文給出三種不同場景下實現統計排名的SQL,可以根據不同業務需求選取合適的排名方案。對比MySQL8.0,發現利用窗口函數可以更輕松實現排名,其實業務需求遠遠比我們舉的示例要復雜許多,用SQL實現此類業務需求還是需要慢慢積累的。

以上就是總結幾種MySQL中常見的排名問題的詳細內容,更多關于MySQL 排名的資料請關注好吧啦網其它相關文章!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 三级中文字幕永久在线视频 | 女人又黄的视频网站 | 免费在线观看毛片 | 久草在线观看视频 | 欧美成视频无需播放器 | 亚洲性xo| 九九久久精品国产 | 亚洲国产精久久久久久久春色 | 亚洲人成网址在线观看 | 国内精品久久精品 | 国产午夜精品久久久久九九 | 欧美成人a级在线视频 | 午夜欧美性欧美 | 久草免费在线视频 | 亚洲精品视 | 免费伦费一区二区三区四区 | 午夜在线观看视频免费 成人 | 欧美 在线 成 人怡红院 | 高清一级淫片a级中文字幕 高清一区二区 | www.色亚洲 | 国产精品视频久久久 | 欧美一级在线观看 | 国内成人免费视频 | 亚洲免费在线视频观看 | 九九九九热精品免费视频 | 一区二区三区四区产品乱码伦 | 99久久精品国产一区二区小说 | 久草免费在线播放视频 | 国产精品系列在线 | 男女午夜24式免费视频 | 国产一区二区fc2ppv在线播放 | 国产成人看片免费视频观看 | 香港国产特级一级毛片 | 久草草视频在线观看免费高清 | 成人毛片免费看 | a毛片免费全部播放完整成 a毛片免费全部在线播放毛 | 99视频免费在线观看 | 日本一本久道 | 波多野结衣中文视频 | 日本aa级片 | 成年女人毛片免费观看97 |