MySQL之dense_rank()分組排序函數(shù)的使用
DENSE_RANK()是一種窗口函數(shù),用于在數(shù)據(jù)庫中計算密集等級。它為每個行分配一個密集等級,并根據(jù)指定的排序順序進行排列。比如:如果有兩個排名為1的值,接下來的值將會被標記為2,而不是3。
一、dense_rank() 函數(shù)
DENSE_RANK() 也是一個窗口函數(shù),用于為結果集中的每一行分配排名。DENSE_RANK() 在遇到相同的排序值時,會為相同的行分配相同的排名,并且下一個排名不會跳過。換句話說,如果有兩個排名為1的值,接下來的值將會被標記為2,而不是3。
語法結構:
DENSE_RANK() OVER ( PARTITION BY <expression>[{,<expression>...}] ORDER BY <expression> [ASC|DESC], [{,<expression>...}] )
- PARTITION BY:用于將結果集分區(qū),針對每個分區(qū)單獨排名。
- ORDER BY:指定排序的列,決定了排名的依據(jù)。
注意,over()里頭的分組以及排序的執(zhí)行晚于 where 、group by、 order by 的執(zhí)行。
二、使用案例
數(shù)據(jù)準備:
create table `student`( id int(10) not null primary key, name varchar(20) not null, score int(10) not null ); insert into `student` values(1,'a',100); insert into `student` values(2,'b',100); insert into `student` values(3,'c',95); insert into `student` values(4,'d',95); insert into `student` values(5,'e',95); insert into `student` values(6,'a',90); insert into `student` values(7,'a',89);
表數(shù)據(jù):
2.1、按成績進行排名
select *,dense_rank() over(order by score desc) as dr from `student`;
兩個并列第一名后,下一個是第二名,不會跳過排名。
上圖中over中沒有使用partition進行分組,默認都是同一組
2.2、獲取排名前五的數(shù)據(jù)
select * from ( select name, score, dense_rank() over (order by score desc) as dr from `student` ) a where `dr` <=5;
2.3、分組后再排名
select name,score,dense_rank() over(partition by name order by score desc) as dr from `student`;
首先,PARTITION BY子句按姓名將結果集分成多個分區(qū)。
然后,ORDER BY子句按分數(shù)對結果集進行排序。
三、總結
在數(shù)據(jù)分析中,ROW_NUMBER()、RANK() 和 DENSE_RANK() 是非常有用的工具。它們可以幫助用戶快速對數(shù)據(jù)進行排名和分類分析。雖然這三種函數(shù)的作用相似,但因其在處理重復值時的行為不同,所以在使用時需要根據(jù)具體需求進行選擇。
3.1、row_number()、rank() 和 dense_rank() 的區(qū)別
- ROW_NUMBER():為每一行分配唯一的行號,適合唯一標識需求。
- RANK():為重復值分配相同的排名,并在后續(xù)排名中跳過名次,適合需要處理排名的場景。
- DENSE_RANK():為重復值分配相同的排名,但不跳過名次,適合希望連續(xù)排名的場景。
下面表格總結了這三個函數(shù)的主要區(qū)別:
函數(shù) | 特點 | 排名示例 |
---|---|---|
ROW_NUMBER | 為每行分配唯一的數(shù)字 | 1, 2, 3, 4, … |
RANK | 相同的值共享相同的排名,排名會跳過數(shù)字 | 1, 1, 3, 4, … |
DENSE_RANK | 相同的值共享相同的排名,不跳過數(shù)字 | 1, 1, 2, 3, … |
具體請參考《row_number() over (partition by 分組列 order by 排序列 desc)、row_number() 函數(shù)、分組排序函數(shù)》、《數(shù)據(jù)庫rank()分組排序函數(shù)詳解》、《row_number()、rank() 和 dense_rank() 的區(qū)別、分組排序函數(shù)》
到此這篇關于MySQL之dense_rank()分組排序函數(shù)的使用的文章就介紹到這了,更多相關MySQL dense_rank()分組排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MySQL的指定范圍隨機數(shù)函數(shù)rand()的使用技巧
這篇文章主要介紹了MySQL的指定范圍隨機數(shù)函數(shù)rand()的使用技巧,需要的朋友可以參考下2016-09-09MySql創(chuàng)建帶解釋的表及給表和字段加注釋的實現(xiàn)代碼
這篇文章主要介紹了MySql創(chuàng)建帶解釋的表以及給表和字段加注釋的實現(xiàn)方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-12-12mysql密碼忘記后如何修改密碼(2022年最新版詳細教程保姆級)
因為長時間不操作mysql而忘記root密碼的朋友估計不在少數(shù),下面這篇文章主要給大家介紹了關于mysql密碼忘記后如何修改密碼的相關資料,本教程是2022年最新版詳細教程保姆級,需要的朋友可以參考下2022-04-04MySQL count(1)、count(*)、count(字段)的區(qū)別
COUNT在數(shù)據(jù)庫行數(shù)統(tǒng)計中被廣泛使用,那么你知道MySQL count(1)、count(*)、count(字段)的區(qū)別嗎,本文就想的介紹一下,感興趣的可以了解一下2021-12-12Mysql中校對集utf8_unicode_ci與utf8_general_ci的區(qū)別說明
一直對utf8_unicode_ci與utf8_general_ci這2個校對集很迷惑,今天查了手冊有了點眉目。不過對中文字符集來說采用utf8_unicode_ci與utf8_general_ci時有何區(qū)別還是不清楚2012-03-03MySQL數(shù)據(jù)庫wait_timeout參數(shù)詳細介紹
這篇文章主要介紹了MySQL數(shù)據(jù)庫wait_timeout參數(shù)詳細介紹的相關資料,wait_timeout是MySQL中用于控制非交互式連接等待時間的系統(tǒng)變量,影響服務器資源管理和安全性,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-12-12