MySQL 窗口函數( 二 )

  • frame_clause: frame是當前分區的子集,frame子句指定如何定義該子集 。
  • 小結:
    窗口,就是數據范圍,也可以理解為記錄集合,窗口函數就是在滿足某種條件的記錄集合上執行的特殊函數 。即,應用在窗口內的函數 。
    • 靜態窗口:窗口大小是固定的,窗口內的每條記錄都要執行此函數
    • 動態窗口:也叫滑動窗口 , 窗口大小是變化的
    窗口函數有以下功能:
    • 同時具有分組和排序的功能
    • 不減少原表的行數
    2. 窗口函數frame規范
    一個frame是當前分區的一個子集,frame子句指定如何定義這個子集 。
    frame是根據當前行確定的 , 這使得frame可以根據當前行在分區中的位置在分區中移動 。
    • 通過將一個frame定義為從分區開始到當前行的所有行,我們可以計算每一行的運行總數 。
    • 通過將一個frame定義為在當前行的每一邊擴展N行,我們可以計算滾動平均 。
    下面的查詢演示了如何使用移動幀來計算每組按時間順序排列的值的總和,以及從當前行和緊隨其后的行計算的滾動平均值:
    SELECTmanufacturer, `month`, profit,SUM(profit) OVER(PARTITION BY manufacturerORDER BY `month`ROWS unbounded PRECEDING) AS running_total,AVG(profit) OVER(PARTITION BY manufacturerORDER BY `month`ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS running_averageFROMsales;
    MySQL 窗口函數

    文章插圖
    frame 子句語法:
    frame_clause:frame_units frame_extentframe_units:{ROWS | RANGE}【MySQL 窗口函數】在沒有frame子句的情況下,默認frame取決于是否存在ORDER BY子句 。
    frame_units值表示當前行和幀行之間的關系類型:
    • ROWS: frame由開始行和結束行位置定義 。偏移量是行號與當前行號之間的差異 。
    • RANGE: frame由值范圍內的行定義 。偏移量是行值與當前行值之間的差異 。
    frame_extend 表示frame的起始點和結束點 ??梢灾恢付╢rame的開始(在這種情況下,當前行隱式地是結束)或使用BETWEEN指定frame的兩個端點:
    frame_extent:{frame_start | frame_between}frame_between:BETWEEN frame_start AND frame_endframe_start, frame_end: {CURRENT ROW| UNBOUNDED PRECEDING| UNBOUNDED FOLLOWING| expr PRECEDING| expr FOLLOWING}使用BETWEEN語法,frame_start不能發生在frame_end之后 。
    允許的frame_start和frame_end值含義如下: