數據庫rank()分組排序函數的具體使用
RANK()是MySQL數據庫提供的一個窗口函數,用于對查詢結果進行排序并為每個行分配排名。它可以根據指定的排序列對數據進行排序,并返回唯一的排名值。
mysql、oracle、hive都支持rank()函數
一、rank()函數
RANK(): 用于對結果集中的行進行排名。RANK() 會為相同的值分配相同的排名,并在隨后排名中跳過相應的名次
。 例如有兩個并列第一,則前兩名的排名都是1,第三個人的排名是3。
語法結構:
RANK() OVER ( PARTITION BY <expression>[{,<expression>...}] ORDER BY <expression> [ASC|DESC], [{,<expression>...}] )
PARTITION BY子句對結果集進行分區(qū)。RANK()功能在分區(qū)內執(zhí)行;ORDER BY子句按一個或多個列或表達式對分區(qū)內的行進行排序。
注意,over()里頭的分組以及排序的執(zhí)行晚于 where 、group by、 order by 的執(zhí)行。
二、使用案例
數據準備:
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);
表數據:
2.1、按成績進行排名
select *,rank() over(order by score desc) as `rank` from `student`;
兩個并列第一名后,下一個是第三名。
上圖中over中沒有使用partition進行分組,默認都是同一組
2.2、獲取排名前五的數據
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子句按姓名將結果集分成多個分區(qū)。
然后,ORDER BY子句按分數對結果集進行排序。
三、總結
在數據分析中,ROW_NUMBER()、RANK() 和 DENSE_RANK() 是非常有用的工具。它們可以幫助用戶快速對數據進行排名和分類分析。雖然這三種函數的作用相似,但因其在處理重復值時的行為不同,所以在使用時需要根據具體需求進行選擇。
3.1、row_number()、rank() 和 dense_rank() 的區(qū)別
- ROW_NUMBER():為每一行分配唯一的行號,適合唯一標識需求。
- RANK():為重復值分配相同的排名,并在后續(xù)排名中跳過名次,適合需要處理排名的場景。
- DENSE_RANK():為重復值分配相同的排名,但不跳過名次,適合希望連續(xù)排名的場景。
下面表格總結了這三個函數的主要區(qū)別:
函數 | 特點 | 排名示例 |
---|---|---|
ROW_NUMBER | 為每行分配唯一的數字 | 1, 2, 3, 4, … |
RANK | 相同的值共享相同的排名,排名會跳過數字 | 1, 1, 3, 4, … |
DENSE_RANK | 相同的值共享相同的排名,不跳過數字 | 1, 1, 2, 3, … |
具體請參考《row_number() over (partition by 分組列 order by 排序列 desc)、row_number() 函數、分組排序函數》、《dense_rank() 函數的使用》、《row_number()、rank() 和 dense_rank() 的區(qū)別、分組排序函數》
到此這篇關于數據庫rank()分組排序函數的具體使用的文章就介紹到這了,更多相關數據庫rank()分組排序函數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Linux下mysql數據庫的創(chuàng)建導入導出 及一些基本指令
這篇文章主要介紹了Linux數據庫的創(chuàng)建 導入導出 以及一些基本指令,需要的朋友可以參考下2019-08-08