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 )