MySQL8.0 ROW_NUMBER、RANK、DENSE_RANK窗口函數 分組排序排名


MySQL8.0 (ROW_NUMBER)窗口函數 排名


暫時理解函數意義,后面再進行優化,如果有關變量排序,查看這個大哥的

mysql的分組排序和變量賦值順序

先查看一個例子:

# 按照每科課程分數進行排序,cid :課程編號, sid: 學號
	select sid,cid,score,
	row_number() over(partition by cid order by score desc) as 'rank',
    RANK() over(partition by cid order by score desc) as 'rank2',
    DENSE_RANK() over(partition by cid order by score desc) as 'rank3'
	from sc

image.png

row_number() over(partition by sid order by score desc)

使用窗口函數,over在函數調用后包含一個字句,over有兩種形式

row_number() {over(window_spec) | over (window_name)}

window_spec:
[window_name] [partition_clause] [order_clause] [frame_clause]


partition_clause:
PARTITION BY expr [, expr] ... 上面例子的語法

partition_clause PARTITION BY子句指示如何將查詢行划分為組。給定行的窗口函數結果基於包含該行的分區的行。如果PARTITION BY省略,則存在由所有查詢行組成的單個分區。


order_clause:
ORDER BY expr [ASC|DESC] [, expr [ASC|DESC]] ... 上面例子的語法

order_clauseORDER BY子句指示如何對每個分區中的行進行排序。根據ORDER BY子句相等的分區行 被視為對等。如果 ORDER BY省略,則分區行是無序的,沒有隱含的處理順序,並且所有分區行都是對等的。


RANK() over_clause

返回其分區中當前行的排名,帶有間隙。同行被視為關系,並獲得相同的排名。如果存在大於1的組,則此函數不會將連續的等級分配給對等組; 結果是不連續的排名數字。

應該使用此函數將ORDER BY分區行排序為所需的順序。沒有ORDER BY,所有行都是對等的。


DENSE_RANK() over_clause

返回其分區中當前行的排名,沒有間隙。同行被視為關系,並獲得相同的排名。此功能將連續的等級分配給對等組; 結果是,大於1的組不會產生不連續的等級數。

應該使用此函數將ORDER BY分區行排序為所需的順序。沒有ORDER BY,所有行都是對等的。

官方文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM