Oracle分析函数六——数据分布函数及报表函数
Oracle分析函數——數據分布函數及報表函數
CUME_DIST
功能描述:計算一行在組中的相對位置,CUME_DIST總是返回大于0、小于或等于1的數,該數表示該行在N行中的位置。例如,在一個3行的組中,返回的累計分布值為1/3、2/3、3/3
SAMPLE:下例中計算每個部門的員工按薪水排序依次累積出現的分布百分比
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?salary,
?CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary) AS cume_dist
FROM employees
NTILE
功能描述:將一個組分為"表達式"的散列表示,例如,如果表達式=4,則給組中的每一行分配一個數(從1到4),如果組中有20行,則給前5行分配1,給下5行分配2等等。如果組的基數不能由表達式值平均分開,則對這些行進行分配時,組中就沒有任何percentile的行數比其它percentile的行數超過一行,最低的percentile是那些擁有額外行的percentile。例如,若表達式=4,行數=21,則percentile=1的有5行,percentile=2的有5行等等。
SAMPLE:下例中把6行數據分為4份
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?salary,
?NTILE(4) OVER (PARTITION BY department_id ORDER BY salary DESC) AS quartile
?FROM employees
?
PERCENT_RANK
功能描述:和CUME_DIST(累積分配)函數類似,對于一個組中給定的行來說,在計算那行的序號時,先減1,然后除以n-1(n為組中所有的行數)。該函數總是返回0~1(包括1)之間的數。
SAMPLE:下例中如果Khoo的salary為2900,則pr值為0.6,因為RANK函數對于等值的返回序列值是一樣的
?
SELECT??
?department_id,
?first_name||' '||last_name employee_name,
?salary,
?PERCENT_RANK() OVER (PARTITION BY department_id ORDER BY salary) AS pr
FROM employees
ORDER BY department_id,salary;
?
PERCENTILE_DISC
功能描述:返回一個與輸入的分布百分比值相對應的數據值,分布百分比的計算方法見函數CUME_DIST,如果沒有正好對應的數據值,就取大于該分布值的下一個值。
注意:本函數與PERCENTILE_CONT的區別在找不到對應的分布值時返回的替代值的計算方法不同
?
SAMPLE:下例中0.7的分布值在部門30中沒有對應的Cume_Dist值,所以就取下一個分布值0.83333333所對應的SALARY來替代
?
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?salary,
?PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY salary ) OVER (PARTITION BY department_id) "Percentile_Disc",
?CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary) "Cume_Dist"
FROM employees<!--[if !vml]--><!--[endif]-->
PERCENTILE_CONT
功能描述:返回一個與輸入的分布百分比值相對應的數據值,分布百分比的計算方法見函數PERCENT_RANK,如果沒有正好對應的數據值,就通過下面算法來得到值:
RN = 1+ (P*(N-1))其中P是輸入的分布百分比值,N是組內的行數
CRN = CEIL(RN) FRN = FLOOR(RN)
if (CRN = FRN = RN) then
(value of expression from row at RN)
else
(CRN - RN) * (value of expression for row at FRN) +
(RN - FRN) * (value of expression for row at CRN)
注意:本函數與PERCENTILE_DISC的區別在找不到對應的分布值時返回的替代值的計算方法不同
算法太復雜,看不懂了L
SAMPLE:在下例中,對于部門60的Percentile_Cont值計算如下:
P=0.7 N=5 RN =1+ (P*(N-1)=1+(0.7*(5-1))=3.8 CRN = CEIL(3.8)=4
FRN = FLOOR(3.8)=3
(4 - 3.8)* 4800 + (3.8 - 3) * 6000 = 5760
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?salary,??
?PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY salary) OVER (PARTITION BY department_id) "Percentile_Disc",
?PERCENTILE_CONT(0.7) WITHIN GROUP (ORDER BY salary) OVER (PARTITION BY department_id) "Percentile_Cont",
?PERCENT_RANK() OVER (PARTITION BY department_id ORDER BY salary) "Percent_Rank"
?FROM employees
總案例
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?salary,
?CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary) AS cume_dist, --數據分布百分比
?NTILE(4) OVER (PARTITION BY department_id ORDER BY salary) AS quartile,????--數據分布,以NTILE中的exp來計算
?PERCENT_RANK() OVER (PARTITION BY department_id ORDER BY salary) AS pr,????--數據分布百分比,從0開始計
?PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY salary ) OVER (PARTITION BY department_id) "Percentile_Disc",?--輸入的分布百分比值相對應的數據值
?PERCENTILE_CONT(0.7) WITHIN GROUP (ORDER BY salary) OVER (PARTITION BY department_id) "Percentile_Cont"???--表達式太復雜了,...
FROM employees
?
RATIO_TO_REPORT
功能描述:該函數計算expression/(sum(expression))的值,它給出相對于總數的百分比,即當前行對sum(expression)的貢獻。
SAMPLE:下例計算每個員工的工資占該類員工總工資的百分比
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?salary,
?RATIO_TO_REPORT(salary) OVER () AS rr
FROM employees
WHERE job_id = 'PU_CLERK';
REGR_ (Linear Regression) Functions
功能描述:這些線性回歸函數適合最小二乘法回歸線,有9個不同的回歸函數可使用。
REGR_SLOPE:返回斜率,等于COVAR_POP(expr1, expr2) / VAR_POP(expr2)
REGR_INTERCEPT:返回回歸線的y截距,等于
AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2)
REGR_COUNT:返回用于填充回歸線的非空數字對的數目
REGR_R2:返回回歸線的決定系數,計算式為:
If VAR_POP(expr2) = 0 then return NULL
If VAR_POP(expr1) = 0 and VAR_POP(expr2) != 0 then return 1
If VAR_POP(expr1) > 0 and VAR_POP(expr2 != 0 then
return POWER(CORR(expr1,expr),2)
REGR_AVGX:計算回歸線的自變量(expr2)的平均值,去掉了空對(expr1, expr2)后,等于AVG(expr2)
REGR_AVGY:計算回歸線的應變量(expr1)的平均值,去掉了空對(expr1, expr2)后,等于AVG(expr1)
REGR_SXX:返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr2)
REGR_SYY:返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr1)
REGR_SXY:返回值等于REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2)
?
(下面的例子都是在SH用戶下完成的)
SAMPLE 1:下例計算1998年最后三個星期中兩種產品(260和270)在周末的銷售量中已開發票數量和總數量的累積斜率和回歸線的截距
?
SELECT t.fiscal_month_number "Month", t.day_number_in_month "Day",
REGR_SLOPE(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_SLOPE,
REGR_INTERCEPT(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_ICPT
FROM sales s, times t
WHERE s.time_id = t.time_id
AND s.prod_id IN (270, 260)
AND t.fiscal_year=1998
AND t.fiscal_week_number IN (50, 51, 52)
AND t.day_number_in_week IN (6,7)
ORDER BY t.fiscal_month_desc, t.day_number_in_month;
?
SAMPLE 2:下例計算1998年4月每天的累積交易數量
?
SELECT UNIQUE t.day_number_in_month,
REGR_COUNT(s.amount_sold, s.quantity_sold)
OVER (PARTITION BY t.fiscal_month_number ORDER BY t.day_number_in_month)
"Regr_Count"
FROM sales s, times t
WHERE s.time_id = t.time_id
AND t.fiscal_year = 1998 AND t.fiscal_month_number = 4;
?
SAMPLE 3:下例計算1998年每月銷售量中已開發票數量和總數量的累積回歸線決定系數
?
SELECT t.fiscal_month_number,
REGR_R2(SUM(s.amount_sold), SUM(s.quantity_sold))
OVER (ORDER BY t.fiscal_month_number) "Regr_R2"
FROM sales s, times t
WHERE s.time_id = t.time_id
AND t.fiscal_year = 1998
GROUP BY t.fiscal_month_number
ORDER BY t.fiscal_month_number;
?
SAMPLE 4:下例計算1998年12月最后兩周產品260的銷售量中已開發票數量和總數量的累積平均值
?
SELECT t.day_number_in_month,
REGR_AVGY(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month)
"Regr_AvgY",
REGR_AVGX(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month)
"Regr_AvgX"
FROM sales s, times t
WHERE s.time_id = t.time_id
AND s.prod_id = 260
AND t.fiscal_month_desc = '1998-12'
AND t.fiscal_week_number IN (51, 52)
ORDER BY t.day_number_in_month;
?
SAMPLE 5:下例計算產品260和270在1998年2月周末銷售量中已開發票數量和總數量的累積REGR_SXY, REGR_SXX, and REGR_SYY統計值
?
SELECT t.day_number_in_month,
REGR_SXY(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_sxy",
REGR_SYY(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_syy",
REGR_SXX(s.amount_sold, s.quantity_sold)
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_sxx"
FROM sales s, times t
WHERE s.time_id = t.time_id
AND prod_id IN (270, 260)
AND t.fiscal_month_desc = '1998-02'
AND t.day_number_in_week IN (6,7)
ORDER BY t.day_number_in_month;
轉載于:https://www.cnblogs.com/huozhicheng/archive/2010/09/03/2533172.html
總結
以上是生活随笔為你收集整理的Oracle分析函数六——数据分布函数及报表函数的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 前端node 和vue开发之环境搭建
 - 下一篇: win10照片背景黑色改为白色