數(shù)據(jù)庫(kù)rank()分組排序函數(shù)的具體使用
RANK()是MySQL數(shù)據(jù)庫(kù)提供的一個(gè)窗口函數(shù),用于對(duì)查詢結(jié)果進(jìn)行排序并為每個(gè)行分配排名。它可以根據(jù)指定的排序列對(duì)數(shù)據(jù)進(jìn)行排序,并返回唯一的排名值。
mysql、oracle、hive都支持rank()函數(shù)
一、rank()函數(shù)
RANK(): 用于對(duì)結(jié)果集中的行進(jìn)行排名。RANK() 會(huì)為相同的值分配相同的排名,并在隨后排名中跳過(guò)相應(yīng)的名次
。 例如有兩個(gè)并列第一,則前兩名的排名都是1,第三個(gè)人的排名是3。
語(yǔ)法結(jié)構(gòu):
RANK() OVER ( PARTITION BY <expression>[{,<expression>...}] ORDER BY <expression> [ASC|DESC], [{,<expression>...}] )
PARTITION BY子句對(duì)結(jié)果集進(jìn)行分區(qū)。RANK()功能在分區(qū)內(nèi)執(zhí)行;ORDER BY子句按一個(gè)或多個(gè)列或表達(dá)式對(duì)分區(qū)內(nèi)的行進(jìn)行排序。
注意,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、按成績(jī)進(jìn)行排名
select *,rank() over(order by score desc) as `rank` from `student`;
兩個(gè)并列第一名后,下一個(gè)是第三名。
上圖中over中沒(méi)有使用partition進(jìn)行分組,默認(rèn)都是同一組
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é)果集分成多個(gè)分區(qū)。
然后,ORDER BY子句按分?jǐn)?shù)對(duì)結(jié)果集進(jìn)行排序。
三、總結(jié)
在數(shù)據(jù)分析中,ROW_NUMBER()、RANK() 和 DENSE_RANK() 是非常有用的工具。它們可以幫助用戶快速對(duì)數(shù)據(jù)進(jìn)行排名和分類分析。雖然這三種函數(shù)的作用相似,但因其在處理重復(fù)值時(shí)的行為不同,所以在使用時(shí)需要根據(jù)具體需求進(jìn)行選擇。
3.1、row_number()、rank() 和 dense_rank() 的區(qū)別
- ROW_NUMBER():為每一行分配唯一的行號(hào),適合唯一標(biāo)識(shí)需求。
- RANK():為重復(fù)值分配相同的排名,并在后續(xù)排名中跳過(guò)名次,適合需要處理排名的場(chǎng)景。
- DENSE_RANK():為重復(fù)值分配相同的排名,但不跳過(guò)名次,適合希望連續(xù)排名的場(chǎng)景。
下面表格總結(jié)了這三個(gè)函數(shù)的主要區(qū)別:
函數(shù) | 特點(diǎn) | 排名示例 |
---|---|---|
ROW_NUMBER | 為每行分配唯一的數(shù)字 | 1, 2, 3, 4, … |
RANK | 相同的值共享相同的排名,排名會(huì)跳過(guò)數(shù)字 | 1, 1, 3, 4, … |
DENSE_RANK | 相同的值共享相同的排名,不跳過(guò)數(shù)字 | 1, 1, 2, 3, … |
具體請(qǐng)參考《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ù)庫(kù)rank()分組排序函數(shù)的具體使用的文章就介紹到這了,更多相關(guān)數(shù)據(jù)庫(kù)rank()分組排序函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入解析NoSQL數(shù)據(jù)庫(kù)的分布式算法(圖文詳解)
這篇文章主要介紹了深入解析NoSQL數(shù)據(jù)庫(kù)的分布式算法,需要的朋友可以參考下2015-12-12Doris?數(shù)據(jù)模型ROLLUP及前綴索引官方教程
本文檔主要從邏輯層面,描述 Doris 的數(shù)據(jù)模型 ROLLUP 以及前綴索引的概念,以幫助用戶更好的使用 Doris 應(yīng)對(duì)不同的業(yè)務(wù)場(chǎng)景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Linux下mysql數(shù)據(jù)庫(kù)的創(chuàng)建導(dǎo)入導(dǎo)出 及一些基本指令
這篇文章主要介紹了Linux數(shù)據(jù)庫(kù)的創(chuàng)建 導(dǎo)入導(dǎo)出 以及一些基本指令,需要的朋友可以參考下2019-08-08如何在Navicat新建連接、新建數(shù)據(jù)庫(kù)以及導(dǎo)入數(shù)據(jù)庫(kù)
Navicat是圖形化操作MySQL的強(qiáng)大工具,但是當(dāng)數(shù)據(jù)庫(kù)的服務(wù)器沒(méi)有開(kāi)放3306端口給辦公網(wǎng)絡(luò)時(shí),在辦公網(wǎng)使用navicat連接數(shù)據(jù)庫(kù)是連不上的,下面這篇文章主要給大家介紹了關(guān)于如何在Navicat新建連接、新建數(shù)據(jù)庫(kù)以及導(dǎo)入數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2023-05-05使用navicat連接虛擬機(jī)的數(shù)據(jù)庫(kù)進(jìn)行操作詳細(xì)流程
這篇文章主要給大家介紹了關(guān)于使用navicat連接虛擬機(jī)的數(shù)據(jù)庫(kù)進(jìn)行操作詳細(xì)流程,使用Navicat連接虛擬機(jī)的數(shù)據(jù)庫(kù),需要確保虛擬機(jī)和數(shù)據(jù)庫(kù)運(yùn)行狀態(tài),獲取數(shù)據(jù)庫(kù)信息,包括類型、IP地址、端口號(hào)、用戶名和密碼,需要的朋友可以參考下2024-11-11