oracle:分析函數(評級函數、窗口函數等)


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() OVERORDER BY column_name DESCAS rank,
4 DENSE_RANK() OVERORDER BY SUM(column_name) DESCAS 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.使用假想評級與分布函數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM