SQL---窗口函数(window function)
窗口可以理解為記錄集合,窗口函數就是在滿足某種條件的記錄集合上執行的特殊函數。窗口函數也稱為OLAP函數,OLAP即實時分析處理(Online Analytical Processing)。
語法:
window_function (expression) OVER (
[ PARTITION BY part_list ]
[ ORDER BY order_list ]
[ { ROWS | RANGE } BETWEEN frame_start AND frame_end ] )
(注:通過PARTITION BY分組后的記錄集合稱為窗口,如果不使用PARTITION BY,那么整個數據集將作為一個大的窗口。)
(注:窗口函數只能在SELECT子句中使用。)
(注:此處的ORDER BY只用來決定窗口函數按照什么樣的順序進行計算,對結果的排序順序沒有影響。)
可以使用的窗口函數有:
1,能夠作為窗口函數的聚合函數:SUM,AVG,COUNT,MAX,MIN
2,專用窗口函數:RANK,DENSE_RANK,ROW_NUMBER
其中:
RANK():計算排序(如果存在相同位次的記錄,則會跳過之后的位次,比如:1,2,2,4)
DENSE_RANK():計算排序(即使存在相同位次的記錄,也不會跳過之后的位次,比如:1,2,2,3)
ROW_NUMBER():賦予連續且唯一的位次,比如:1,2,3,4
此外,除了partition子句和order by子句,還可以加上frame子句。frame是當前分區的一個子集,frame子句用來定義子集的規則,其通常作為滑動窗口使用。(即指定框架:對窗口進行更詳細地指定。)例如:
ROW 2PRECEDING:前2行
ROW 5FOLLOWING:后5行
ROWS BETWEEN 1PRECEDING AND 1 FOLLOWING:前1行到后1行
例子:
SELECT item_id, cate_id, RANK() OVER (PARTITION BY cate_id ORDER BY price) as rank FROM item_list;
SELECT item_id, cate_id, SUM(price) OVER (ORDER BY item_id) as rank FROM item_list;
SELECT item_id, cate_id, AVG(price) OVER (ORDER BY price ROWS BETWEEN 1 PRECEDING and 1 FOLLOWING) AS rank FROM item_list;
為什么要用窗口函數?
1,在組內進行排名。比如統計各個部門工資前3位的員工名單。
2,累計計數。因為窗口函數以當前記錄作為基準進行統計,因此可以計算截止到當前的累計訂單金額是多少(running total),還可以加上指定框架來計算移動平均(movingaverage)。
參考:
https://ericfu.me/sql-window-function/
總結
以上是生活随笔為你收集整理的SQL---窗口函数(window function)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《仙境传说RO:新启航》附魔材料详情
- 下一篇: 《狗子放置3》新手玩法攻略-狗子放置3新