MySQL視窗函式用法總結

Yfeil發表於2024-05-14

1.聚合函式

SUM( 列 ) OVER( ... ) :求總和

AVG( 列 ) OVER( ... ) :求平均

COUNT( 列 ) OVER( ... ) :求總數

MIN( 列 ) OVER( ... ) :取最小值

MAX( 列 ) OVER( ... ) :取最大值

2.排名函式

RANK() OVER(...) :如果排名相同,編號跳過,比如 1、2、2、5

DENSE_RANK() OVER(...) :編號不跳過,比如 1、2、2、4

ROW_NUMBER() OVER(...) :如果排名相同,編號不會重複,比如 1、2、3、4

NTILE( n ) OVER(...) :均勻地劃分n個組,返回對應組號。

3.跨行取值函式

LAG( 列, 偏移, 預設值 ) OVER(...) :上 n 行,可以只寫 LAG(列),預設取上一行

LEAD( 列, 偏移, 預設值 ) OVER(...) :下 n 行,同上

FIRST_VALUE( 列 ) OVER(...) :首行

LAST_VALUE( 列 ) OVER(...) :尾行

4.分佈函式

PERCENT_RANK() OVER(ORDER BY 列) :計算 小於 當前值的行數佔 總行數 - 1 的比例。

CUME_DIST() OVER(ORDER BY 列) :計算 小於等於 當前值的行數佔總行數的比例。

5.排序分組關鍵字

OVER( PARTITION BY 列 ) :分組

OVER( ORDER BY 列 ) :排序,注意:如果配合聚合函式使用會產生截斷效果,導致只能聚合到當前行及之前的資料。可結合移動關鍵字解除。

6.視窗移動

移動關鍵字:

ROWS :以 行號 為單位移動視窗。

RANGE :以 欄位值 為單位移動視窗,必須結合排序關鍵字,以 ORDER BY 的列值為移動基準。

範圍關鍵字:

UNBOUNDED PRECEDING :首行

n PRECEDING :前 n 行

CURRENT ROW :當前行

n FOLLOWING :後 n 行

UNBOUNDED FOLLOWING :末行

演示:

# 上一行 到 當前行
OVER( ROWS 1 PRECEDING )
# 首行 到 當前行
OVER( ROWS UNBOUNDED PRECEDING )
# 當前行 到 下一行
OVER( ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING )
# 上一行 到 末行
OVER( ROWS BETWEEN 1 PRECEDING AND UNBOUNDED FOLLOWING )

# 當前天 到 下一天
# RANGE 以值為單位
# 如果當前日期是 2024-5-1,那麼所有等於 2024-5-1 和 2024-5-2 的資料都會被聚合。
# RANGE 只會統計當前天 和 +1 天的記錄,如果沒有 2024-5-2 ,不會接著去找 2024-5-3。
COUNT( mydate )OVER( ORDER BY mydate RANGE BETWEEN CURRENT ROW AND 1 FOLLOWING )

# 上一天 到 當前天
COUNT( myinter )OVER( ORDER BY mydate RANGE ROWS 1 PRECEDING )

相關文章