首頁 > 軟體

MySQL中rank() over、dense_rank() over、row_number() over用法介紹

2022-03-23 13:01:05

前言

本篇介紹的三個函數均MySQL 8.x 以上版本,8.x以下版本會報語法錯誤,屬於正常現象。

MySQL 8.x 實際上就是 MySQL 5.8x,大概是為了通過更大版本型號數位,證明自己比友商先進吧。

你可以通過 mysql --version (cmd命令)或者 select version() (sql語句)檢視MySQL版本型號。

LeetCode.178題(https://leetcode-cn.com/problems/rank-scores/

上述的這道題,如果不使用本次用到的函數的答案如下,也就是說,如果你的MySQL無法使用本篇中的函數,可以通過下面的語法邏輯做替換。

SELECT t1.Score as Score, ( SELECT COUNT(DISTINCT t2.Score) FROM Scores t2 WHERE t2.Score >= t1.Score ) AS `Rank` 
FROM Scores t1 ORDER BY t1.Score DESC 

rank() over(業務邏輯)

作用:查出指定條件後的進行排名,條件相同排名相同,排名間斷不連續。

說明:例如學生排名,使用這個函數,成績相同的兩名是並列,下一位同學空出所佔的名次。即:1 1 3 4 5 5 7

SELECT id, name, score, rank() over(ORDER BY score DESC) AS 'rank' FROM student 

dense_rank() over(業務邏輯)

作用:查出指定條件後的進行排名,條件相同排名相同,排名間斷不連續。

說明:和rank() over 的作用相同,區別在於dense_rank() over 排名是密集連續的。例如學生排名,使用這個函數,成績相同的兩名是並列,下一位同學接著下一個名次。即:1 1 2 3 4 5 5 6

SELECT id, name, score, dense_rank() over(ORDER BY score DESC) AS 'rank' FROM student 

row_number() over(業務邏輯)

作用:查出指定條件後的進行排名,條件相同排名也不相同,排名間斷不連續。

說明:這個函數不需要考慮是否並列,即使根據條件查詢出來的數值相同也會進行連續排序。即:1 2 3 4 5 6

SELECT id, name, score, row_number() over(ORDER BY score DESC) AS 'rank' FROM student 

 

後記

函數中的業務邏輯可以是複雜的,不侷限於 ORDER BY,也可以加 PARTITION BY。

### 分班級排名
SELECT id, name, score, class, row_number() over(PARTITION BY class ORDER BY score DESC) AS 'rank' 
FROM student 

 到此這篇關於MySQL中rank() over、dense_rank() over、row_number() over用法介紹的文章就介紹到這了,更多相關MySQL rank() over dense_rank() over row_number() over內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com