MySQL8.0 (ROW_NUMBER)窗口函數 排名
暫時理解函數意義,后面再進行優化,如果有關變量排序,查看這個大哥的
先查看一個例子:
# 按照每科課程分數進行排序,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
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_clause:ORDER BY
子句指示如何對每個分區中的行進行排序。根據ORDER BY
子句相等的分區行 被視為對等。如果 ORDER BY
省略,則分區行是無序的,沒有隱含的處理順序,並且所有分區行都是對等的。
RANK() over_clause
返回其分區中當前行的排名,帶有間隙。同行被視為關系,並獲得相同的排名。如果存在大於1的組,則此函數不會將連續的等級分配給對等組; 結果是不連續的排名數字。
應該使用此函數將ORDER BY
分區行排序為所需的順序。沒有ORDER BY
,所有行都是對等的。
DENSE_RANK() over_clause
返回其分區中當前行的排名,沒有間隙。同行被視為關系,並獲得相同的排名。此功能將連續的等級分配給對等組; 結果是,大於1的組不會產生不連續的等級數。
應該使用此函數將ORDER BY
分區行排序為所需的順序。沒有ORDER BY
,所有行都是對等的。