1.評級函數:
用於等級、百分點、n分片等。
函數 |
說明 |
RANK() |
返回數據項在分組中的排名,排名相等會在名次中留下空位 |
DENSE_RANK() |
返回數據項在分組中的排名,排名相等會在名次中不會留下空位 |
CUME_DIST() |
返回特定值對於一組值的位置“cumulative distribution”(累積分布) |
PERCENT_RANK()( |
返回某個值相對於一組值的百分比排名 |
NTILE() |
返回n分片后的值 |
ROW_NUMBER() |
為每條記錄返回一個數字 |
- RANK()、DENSE_RANK()
RANK()在出現等級相同的元素時預留為空,DENSE_RANK()不會。
Eg:某產品類型有兩個並列第一
RANK():第一二為1,第三位3
DENSE_RANK():第一二為1,第三位2
1 SELECT
2 column_name,
3 RANK() OVER (ORDER BY column_name DESC) AS rank,
4 DENSE_RANK() OVER (ORDER BY SUM(column_name) DESC) AS dense_rank
5 FROM table_name
OVER 需要,括號內為編號順序
注意:order by 時,desc NULL 值排在首位,ASC時NULL值排在末尾
可以通過NULLS LAST、NULLS FIRST 控制
RANK() OVER (ORDER BY column_name DESC NULLS LAST)
PARTITION BY 分組排列順序
RANK() OVER(PARTITION BY month ORDER BY column_name DESC)
這樣,就會按照month 來分,即所需要排列的信息先以month 的值來分組,在分組中排序,各個分組間不干涉
ROLLUP、CUBE、GROUP SETS (只顯示小計信息) 與 RANK() 結合使用
- CUME_DIST()、PERCENT_RANK()
反百分比函數:PERCENTILE_DISC(x), PERCENTILE_CONT(x)
- NTILE()
- ROW_NUMBER()
ROW_NUMBER()從1開始,為每條記錄返回一個數字
SELECT
ROW_NUMBER() OVER (ORDER BY column_name DESC)AS row_name
FROM table_name;
2.窗口函數:
可以計算一定范圍內、一定值域內、或者一段時間內的累積和以及移動平均值等。
可以結合聚集函數SUM() 、AVG() 等使用。
可以結合FIRST_VALUE() 和LAST_VALUE(),返回窗口的第一個和最后一個值
- 計算累積和:
eg:統計1-12月的累積銷量,即1月為1月份的值,2月為1.2月份值的和,3月為123月份的和,12月為1-12月份值的和
SELECT
month,SUM(amount) month_amount,
SUM( SUM(amount)) OVER (ORDER BY month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_amount
FROM table_name
GROUP BY month
ORDER BY month;
其中:
SUM( SUM(amount)) 內部的SUM(amount)為需要累加的值,在上述可以換為 month_amount
ORDER BY month 按月份對查詢讀取的記錄進行排序,就是窗口范圍內的排序
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 定義起點和終點,UNBOUNDED PRECEDING 為起點,表明從第一行開始, CURRENT ROW為默認值,就是這一句等價於:
ROWS UNBOUNDED PRECEDING
PRECEDING:在前 的意思。
FOLLOWING: 在后 的意思。
計算前3個月之間的和
SUM( SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS cumulative_amount
也可以
SUM( SUM(amount)) OVER (ORDER BY month 3 PRECENDING) AS cumulative_amount
前后一個月之間的和
SUM( SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS cumulative_amount
窗體第一條和最后一條的值
FIRST_VALUE(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS xxxx;
LAST_VALUE(SUM(amount)) OVER (ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS xxxx;
這樣就可以獲得該行上一行和下一行的值
3.報表函數:
用於執行跨越分組和組內分區的計算 (這里的組應該指的是 ORDER BY 的分組)
SUM(column_name1) OVER(PARTITION BY column_name2)
這樣,會將數據按column_name2分組,然后求column_name1的和,但在表輸出的時候是按ORDER BY 格式輸出
這樣輸出列會重復,例如相同的column_name2 會輸出相同的column_name1
4.LAG()、LEAD()
獲得相對於當前記錄指定距離的那條記錄的數據
LAG()為向前、LEAD()為向后
LAG(column_name1,1) OVER(ORDER BY column_name2)
LEAG(column_name1,1) OVER(ORDER BY column_name2)
這樣就獲得前一條、后一條的數據
5.FIRST、LAST
獲得一個排序分組中的第一個值和組后一個值。可以與分組分組函數結合。
SELECT
MIN(month) KEEP(DENSE_RANK FIRST ORDER BY SUM(amount)) AS highest_sales_month,
MIN(month) KEEP(DENSE_RANK LAST ORDER BY SUM(amount)) AS lows_sales_month
FROM table_name
GROUP BY month
ORDER BY month;
這樣就可以求得一年中銷量最高和最低的月份。
注意:輸出的是月份,但是用SUM(amount)來判斷。
6.使用線性回歸函數
7.使用假想評級與分布函數