數(shù)據(jù)庫rank()分組排序函數(shù)的具體使用
RANK()是MySQL數(shù)據(jù)庫提供的一個窗口函數(shù),用于對查詢結(jié)果進行排序并為每個行分配排名。它可以根據(jù)指定的排序列對數(shù)據(jù)進行排序,并返回唯一的排名值。
mysql、oracle、hive都支持rank()函數(shù)
一、rank()函數(shù)
RANK(): 用于對結(jié)果集中的行進行排名。RANK() 會為相同的值分配相同的排名,并在隨后排名中跳過相應(yīng)的名次。 例如有兩個并列第一,則前兩名的排名都是1,第三個人的排名是3。
語法結(jié)構(gòu):
RANK() OVER (
PARTITION BY <expression>[{,<expression>...}]
ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)
PARTITION BY子句對結(jié)果集進行分區(qū)。RANK()功能在分區(qū)內(nèi)執(zhí)行;ORDER BY子句按一個或多個列或表達式對分區(qū)內(nèi)的行進行排序。
注意,over()里頭的分組以及排序的執(zhí)行晚于 where 、group by、 order by 的執(zhí)行。
二、使用案例
數(shù)據(jù)準(zhǔn)備:
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 *,rank() over(order by score desc) as `rank` from `student`;
兩個并列第一名后,下一個是第三名。

上圖中over中沒有使用partition進行分組,默認都是同一組
2.2、獲取排名前五的數(shù)據(jù)
select * from ( select name, score, rank() over (order by score desc) as `rank` from `student` ) a where `rank` <=5;

2.3、分組后再排名
select name,score,rank() over(partition by name order by score desc) as `rank` from `student`;
首先,PARTITION BY子句按姓名將結(jié)果集分成多個分區(qū)。
然后,ORDER BY子句按分?jǐn)?shù)對結(jié)果集進行排序。

三、總結(jié)
在數(shù)據(jù)分析中,ROW_NUMBER()、RANK() 和 DENSE_RANK() 是非常有用的工具。它們可以幫助用戶快速對數(shù)據(jù)進行排名和分類分析。雖然這三種函數(shù)的作用相似,但因其在處理重復(fù)值時的行為不同,所以在使用時需要根據(jù)具體需求進行選擇。
3.1、row_number()、rank() 和 dense_rank() 的區(qū)別
- ROW_NUMBER():為每一行分配唯一的行號,適合唯一標(biāo)識需求。
- RANK():為重復(fù)值分配相同的排名,并在后續(xù)排名中跳過名次,適合需要處理排名的場景。
- DENSE_RANK():為重復(fù)值分配相同的排名,但不跳過名次,適合希望連續(xù)排名的場景。
下面表格總結(jié)了這三個函數(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ù)》、《dense_rank() 函數(shù)的使用》、《row_number()、rank() 和 dense_rank() 的區(qū)別、分組排序函數(shù)》
到此這篇關(guān)于數(shù)據(jù)庫rank()分組排序函數(shù)的具體使用的文章就介紹到這了,更多相關(guān)數(shù)據(jù)庫rank()分組排序函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Navicat導(dǎo)入和導(dǎo)出sql語句的圖文教程
Navicat是MySQL非常好用的可視化管理工具,功能非常強大,能滿足我們?nèi)粘?shù)據(jù)庫開發(fā)的所有需求,下面這篇文章主要給大家介紹了關(guān)于使用Navicat導(dǎo)入和導(dǎo)出sql語句的相關(guān)資料,需要的朋友可以參考下2023-03-03
SunlightDB 2017新型區(qū)塊鏈數(shù)據(jù)庫
這篇文章主要為大家詳細介紹了SunlightDB 2017新型區(qū)塊鏈數(shù)據(jù)庫的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
CentOS 7.9部署openGauss數(shù)據(jù)庫的實戰(zhàn)指南
openGauss作為企業(yè)級開源關(guān)系型數(shù)據(jù)庫,既具備OLTP/OLAP混合負載的能力,也在向量計算、AI檢索等新場景上持續(xù)演進,下面我們就來看看如何在CentOS 7.9上部署openGauss數(shù)據(jù)庫吧2025-11-11
如何利用分析函數(shù)改寫范圍判斷自關(guān)聯(lián)查詢詳解
這篇文章主要給大家介紹了關(guān)于如何利用分析函數(shù)改寫范圍判斷自關(guān)聯(lián)查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用sql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10

