Oracle所有分析函数转
Oracle分析函數(shù)——函數(shù)列表
?
SUM????????:該函數(shù)計(jì)算組中表達(dá)式的累積和
MIN????????:在一個(gè)組中的數(shù)據(jù)窗口中查找表達(dá)式的最小值
MAX????????:在一個(gè)組中的數(shù)據(jù)窗口中查找表達(dá)式的最大值
AVG?????????:用于計(jì)算一個(gè)組和數(shù)據(jù)窗口內(nèi)表達(dá)式的平均值。
COUNT??????:對(duì)一組內(nèi)發(fā)生的事情進(jìn)行累積計(jì)數(shù)
-------------------------------------------------------------------------------------------------
RANK???????:根據(jù)ORDER BY子句中表達(dá)式的值,從查詢(xún)返回的每一行,計(jì)算它們與其它行的相對(duì)位置
DENSE_RANK?:根據(jù)ORDER BY子句中表達(dá)式的值,從查詢(xún)返回的每一行,計(jì)算它們與其它行的相對(duì)位置
FIRST???????:從DENSE_RANK返回的集合中取出排在最前面的一個(gè)值的行
LAST????????:從DENSE_RANK返回的集合中取出排在最后面的一個(gè)值的行
FIRST_VALUE?:返回組中數(shù)據(jù)窗口的第一個(gè)值
LAST_VALUE?:返回組中數(shù)據(jù)窗口的最后一個(gè)值。
LAG????????:可以訪問(wèn)結(jié)果集中的其它行而不用進(jìn)行自連接
LEAD???????:LEAD與LAG相反,LEAD可以訪問(wèn)組中當(dāng)前行之后的行
ROW_NUMBER:返回有序組中一行的偏移量,從而可用于按特定標(biāo)準(zhǔn)排序的行號(hào)
-------------------------------------------------------------------------------------------------
STDDEV?????:計(jì)算當(dāng)前行關(guān)于組的標(biāo)準(zhǔn)偏離
STDDEV_POP:該函數(shù)計(jì)算總體標(biāo)準(zhǔn)偏離,并返回總體變量的平方根
STDDEV_SAMP:該函數(shù)計(jì)算累積樣本標(biāo)準(zhǔn)偏離,并返回總體變量的平方根
VAR_POP????:該函數(shù)返回非空集合的總體變量(忽略null)
VAR_SAMP???:該函數(shù)返回非空集合的樣本變量(忽略null)
VARIANCE???:如果表達(dá)式中行數(shù)為1,則返回0,如果表達(dá)式中行數(shù)大于1,則返回VAR_SAMP
COVAR_POP??:返回一對(duì)表達(dá)式的總體協(xié)方差
COVAR_SAMP:返回一對(duì)表達(dá)式的樣本協(xié)方差
CORR???????:返回一對(duì)表達(dá)式的相關(guān)系數(shù)
-------------------------------------------------------------------------------------------------
CUME_DIST??:計(jì)算一行在組中的相對(duì)位置
NTILE???????:將一個(gè)組分為"表達(dá)式"的散列表示
PERCENT_RANK:和CUME_DIST(累積分配)函數(shù)類(lèi)似
PERCENTILE_DISC:返回一個(gè)與輸入的分布百分比值相對(duì)應(yīng)的數(shù)據(jù)值
PERCENTILE_CONT:返回一個(gè)與輸入的分布百分比值相對(duì)應(yīng)的數(shù)據(jù)值
RATIO_TO_REPORT:該函數(shù)計(jì)算expression/(sum(expression))的值,它給出相對(duì)于總數(shù)的百分比
REGR_ (Linear Regression) Functions:這些線性回歸函數(shù)適合最小二乘法回歸線,有9個(gè)不同的回歸函數(shù)可使用
-------------------------------------------------------------------------------------------------
CUBE????????:按照OLAP的CUBE方式進(jìn)行數(shù)據(jù)統(tǒng)計(jì),即各個(gè)維度均需統(tǒng)計(jì)
ROLLUP??????:
?
?
SELECT
?department_id,
?manager_id,
?employee_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?job_id
?FROM employees
?ORDER BY department_id,hire_date
?
Oracle分析函數(shù)實(shí)際上操作對(duì)象是查詢(xún)出的數(shù)據(jù)集,也就是說(shuō)不需二次查詢(xún)數(shù)據(jù)庫(kù),實(shí)際上就是oracle實(shí)現(xiàn)了一些我們自身需要編碼實(shí)現(xiàn)的統(tǒng)計(jì)功能,對(duì)于簡(jiǎn)化開(kāi)發(fā)工作量有很大的幫助,特別在開(kāi)發(fā)第三方報(bào)表軟件時(shí)是非常有幫助的。Oracle從8.1.6開(kāi)始提供分析函數(shù)。
oracle分析函數(shù)的語(yǔ)法:
function_name(arg1,arg2,...)
over
( )
?????說(shuō)明:
1. partition-clause?數(shù)據(jù)記錄集分組
2. order-by-clause??數(shù)據(jù)記錄集排序
3. windowing clause?功能非常強(qiáng)大、比較復(fù)雜,定義分析函數(shù)在操作行的集合。有三種開(kāi)窗方式: range、row、specifying。
?
--Partition by,按相應(yīng)的值(manager_id)進(jìn)行分組統(tǒng)計(jì)
SELECT
?manager_id,
?first_name||' '||last_name employee_name,
??hire_date,
?salary,
?AVG(salary) OVER (PARTITION BY manager_id) avg_salary
FROM employees;
--等同于上面
SELECT
?a.manager_id,
?a.employee_name,
?a.hire_date,
?a.salary,
?b.avg_salary
FROM
(
?SELECT
???manager_id,
???first_name||' '||last_name employee_name,
???hire_date,
???salary
???FROM employees
) a,
(
?SELECT
???manager_id,
???AVG(salary) avg_salary
???FROM employees
??GROUP BY manager_id
) b
WHERE a.manager_id=b.manager_id
ORDER BY a.manager_id
?
--Order by按相應(yīng)的值(hire_date)進(jìn)行排序并累計(jì)統(tǒng)計(jì)
SELECT
?manager_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?AVG(salary) OVER (ORDER BY hire_date)
FROM employees;
--Partition by Order by首先按相應(yīng)的值(manager_id,hire_date)排序,并按order by的值(hire_date)進(jìn)行累計(jì)統(tǒng)計(jì)
SELECT
?manager_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date)
FROM employees;
--Partition by Order by首先按相應(yīng)的值(manager_id,hire_date)排序,并按order by的值(hire_date)進(jìn)行累計(jì)統(tǒng)計(jì)
--該平均值由當(dāng)前員工和與之具有相同經(jīng)理的前一個(gè)和后兩個(gè)三者的平均數(shù)得來(lái)
SELECT
?manager_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING)
FROM employees;
?
--Partition by Order by首先按相應(yīng)的值(manager_id,hire_date)排序,并按order by的值(hire_date)進(jìn)行累計(jì)統(tǒng)計(jì)
--該平均值由當(dāng)前員工和與之具有相同經(jīng)理,并且雇用時(shí)間在該員工時(shí)間之前的50天以?xún)?nèi)和在該員工之后的150天之內(nèi)員工的薪水的平均值
--range為取值范圍,估計(jì)只有數(shù)字和日期能夠進(jìn)行取值了
SELECT
?manager_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING)
FROM employees;
--Partition by Order by首先按相應(yīng)的值(manager_id,hire_date)排序,并按order by的值(hire_date)進(jìn)行累計(jì)統(tǒng)計(jì)
--該平均值由當(dāng)前員工和與之具有相同經(jīng)理的平均值
--每行對(duì)應(yīng)的數(shù)據(jù)窗口是從第一行到最后一行
SELECT
?manager_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date) avg_salary_part_order,
?AVG(salary) OVER (PARTITION BY manager_id ) avg_salary_order,?
?AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) avg_salary_unbound1, --等同于僅partition時(shí)候的值
?AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) avg_salary_unbound2--等同于上面
FROM employees;
?
?
Oracle分析函數(shù)——SUM,AVG,MIN,MAX,COUNT
SUM
功能描述:該函數(shù)計(jì)算組中表達(dá)式的累積和。
SAMPLE:下例計(jì)算同一經(jīng)理下員工的薪水累積值
?
MIN
功能描述:在一個(gè)組中的數(shù)據(jù)窗口中查找表達(dá)式的最小值。
SAMPLE:下面例子中dept_min返回當(dāng)前行所在部門(mén)的最小薪水值
?
MAX
功能描述:在一個(gè)組中的數(shù)據(jù)窗口中查找表達(dá)式的最大值。
SAMPLE:下面例子中dept_max返回當(dāng)前行所在部門(mén)的最大薪水值
?
AVG
功能描述:用于計(jì)算一個(gè)組和數(shù)據(jù)窗口內(nèi)表達(dá)式的平均值。
SAMPLE:下面的例子中列c_mavg計(jì)算員工表中每個(gè)員工的平均薪水報(bào)告
?
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?hire_date,?
?salary,
?MIN(salary) OVER (PARTITION BY department_id order by hire_date) AS dept_min,
?MAX(salary) OVER (PARTITION BY department_id order by hire_date) AS dept_max,?
?AVG(salary) OVER (PARTITION BY department_id order by hire_date) AS dept_avg,???
?SUM(salary) OVER (PARTITION BY department_id order by hire_date) AS dept_sum/*,???
?COUNT(*) OVER (ORDER BY salary) AS count_by_salary,?
?COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING) AS count_by_salary_range*/
FROM employees
?
COUNT
功能描述:對(duì)一組內(nèi)發(fā)生的事情進(jìn)行累積計(jì)數(shù),如果指定*或一些非空常數(shù),count將對(duì)所有行計(jì)數(shù),如果指定一個(gè)表達(dá)式,count返回表達(dá)式非空賦值的計(jì)數(shù),當(dāng)有相同值出現(xiàn)時(shí),這些相等的值都會(huì)被納入被計(jì)算的值;可以使用DISTINCT來(lái)記錄去掉一組中完全相同的數(shù)據(jù)后出現(xiàn)的行數(shù)。
SAMPLE:下面例子中計(jì)算每個(gè)員工在按薪水排序中當(dāng)前行附近薪水在[n-50,n+150]之間的行數(shù),n表示當(dāng)前行的薪水
例如,Philtanker的薪水2200,排在他之前的行中薪水大于等于2200-50的有1行,排在他之后的行中薪水小于等于2200+150的行沒(méi)有,所以count計(jì)數(shù)值cnt3為2(包括自己當(dāng)前行);cnt2值相當(dāng)于小于等于當(dāng)前行的SALARY值的所有行數(shù)
?
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?salary,
?COUNT(*) OVER (ORDER BY salary) AS count_by_salary,?
?COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING) AS count_by_salary_range
FROM employees
WHERE department_id in (10,20,30);
?
?
?
?
?
Oracle分析函數(shù)——函數(shù)RANK,DENSE_RANK,FIRST,LAST…
RANK
功能描述:根據(jù)ORDER BY子句中表達(dá)式的值,從查詢(xún)返回的每一行,計(jì)算它們與其它行的相對(duì)位置。組內(nèi)的數(shù)據(jù)按ORDER BY子句排序,然后給每一行賦一個(gè)號(hào),從而形成一個(gè)序列,該序列從1開(kāi)始,往后累加。每次ORDER BY表達(dá)式的值發(fā)生變化時(shí),該序列也隨之增加。有同樣值的行得到同樣的數(shù)字序號(hào)(認(rèn)為null時(shí)相等的)。然而,如果兩行的確得到同樣的排序,則序數(shù)將隨后跳躍。若兩行序數(shù)為1,則沒(méi)有序數(shù)2,序列將給組中的下一行分配值3,DENSE_RANK則沒(méi)有任何跳躍。
SAMPLE:下例中計(jì)算每個(gè)員工按部門(mén)分區(qū)再按薪水排序,依次出現(xiàn)的序列號(hào)(注意與DENSE_RANK函數(shù)的區(qū)別)
?
DENSE_RANK
功能描述:根據(jù)ORDER BY子句中表達(dá)式的值,從查詢(xún)返回的每一行,計(jì)算它們與其它行的相對(duì)位置。組內(nèi)的數(shù)據(jù)按ORDER BY子句排序,然后給每一行賦一個(gè)號(hào),從而形成一個(gè)序列,該序列從1開(kāi)始,往后累加。每次ORDER BY表達(dá)式的值發(fā)生變化時(shí),該序列也隨之增加。有同樣值的行得到同樣的數(shù)字序號(hào)(認(rèn)為null時(shí)相等的)。密集的序列返回的時(shí)沒(méi)有間隔的數(shù)
SAMPLE:下例中計(jì)算每個(gè)員工按部門(mén)分區(qū)再按薪水排序,依次出現(xiàn)的序列號(hào)(注意與RANK函數(shù)的區(qū)別)
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?salary,
?RANK() OVER (ORDER BY salary) AS RANK_ORDER,
?DENSE_RANK() OVER (ORDER BY salary) AS DENSE_RANK_ORDER??
FROM employees
?
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?salary,
?RANK() OVER (PARTITION BY department_id ORDER BY salary) AS RANK_PART_ORDER,?
?DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary) AS DENSE_RANK_PART_ORDER???
FROM employees
?
?
Oracle分析函數(shù)——統(tǒng)計(jì)分析函數(shù)
方差和標(biāo)準(zhǔn)差:
樣本中各數(shù)據(jù)與樣本平均數(shù)的差的平方和的平均數(shù)叫做樣本方差;樣本方差的算術(shù)平方根叫做樣本標(biāo)準(zhǔn)差。樣本方差和樣本標(biāo)準(zhǔn)差都是衡量一個(gè)樣本波動(dòng)大小的量,樣本方差或樣本標(biāo)準(zhǔn)差越大,樣本數(shù)據(jù)的波動(dòng)就越大。
數(shù)學(xué)上一般用E{[X-E(X)]^2}來(lái)度量隨機(jī)變量X與其均值E(X)即期望的偏離程度,稱(chēng)為X的方差。
方差是標(biāo)準(zhǔn)差的平方
方差和標(biāo)準(zhǔn)差。方差和標(biāo)準(zhǔn)差是測(cè)算離散趨勢(shì)最重要、最常用的指標(biāo)。方差是各變量值與其均值離差平方的平均數(shù),它是測(cè)算數(shù)值型數(shù)據(jù)離散程度的最重要的方法。標(biāo)準(zhǔn)差為方差的平方根,用S表示。
?
StdDev返回expr的樣本標(biāo)準(zhǔn)偏差。它可用作聚集和分析函數(shù)。它與stddev_samp的不同之處在于,當(dāng)計(jì)算的輸入數(shù)據(jù)只有一行時(shí),stddev返回0,而stddev_samp返回null。
?
Oracle數(shù)據(jù)庫(kù)中,標(biāo)準(zhǔn)偏差計(jì)算結(jié)果與variance用作集聚函數(shù)計(jì)算結(jié)果的平方根相等。該函數(shù)參數(shù)可取任何數(shù)字類(lèi)型或是任何能隱式轉(zhuǎn)換成數(shù)字類(lèi)型的非數(shù)字類(lèi)型。
STDDEV
功能描述:計(jì)算當(dāng)前行關(guān)于組的標(biāo)準(zhǔn)偏離。(Standard Deviation)
SAMPLE:
?
STDDEV_SAMP
功能描述:該函數(shù)計(jì)算累積樣本標(biāo)準(zhǔn)偏離,并返回總體變量的平方根,其返回值與VAR_POP函數(shù)的平方根相同。(Standard Deviation-Sample)
SAMPLE:
它與stddev_samp的不同之處在于,當(dāng)計(jì)算的輸入數(shù)據(jù)只有一行時(shí),stddev返回0,而stddev_samp返回null。
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?STDDEV_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS cum_sdev
?FROM employees
?WHERE department_id in (20,30,60);
?
STDDEV和STDDEV_SAMP的區(qū)別
SELECT
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?STDDEV(salary) OVER (ORDER BY hire_date) "StdDev",
?STDDEV_SAMP(salary) OVER (ORDER BY hire_date) AS cum_sdev
?FROM employees
?
VAR_POP
功能描述:(Variance Population)該函數(shù)返回非空集合的總體變量(忽略null),VAR_POP進(jìn)行如下計(jì)算:
(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)
?
VAR_SAMP
功能描述:(Variance Sample)該函數(shù)返回非空集合的樣本變量(忽略null),VAR_POP進(jìn)行如下計(jì)算:
(SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1)
SAMPLE:
?
VARIANCE
功能描述:該函數(shù)返回表達(dá)式的變量,Oracle計(jì)算該變量如下:
如果表達(dá)式中行數(shù)為1,則返回0
如果表達(dá)式中行數(shù)大于1,則返回VAR_SAMP
SAMPLE:
?
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?STDDEV(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "STDDEV",
?STDDEV_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "STDDEV_SAMP",
?VAR_POP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "VAR_POP",
?VAR_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "VAR_SAMP",
?VARIANCE(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "VARIANCE"?
?FROM employees
?
協(xié)方差分析是建立在方差分析和回歸分析基礎(chǔ)之上的一種統(tǒng)計(jì)分析方法。
方差分析是從質(zhì)量因子的角度探討因素不同水平對(duì)實(shí)驗(yàn)指標(biāo)影響的差異。一般說(shuō)來(lái),質(zhì)量因子是可以人為控制的。
回歸分析是從數(shù)量因子的角度出發(fā),通過(guò)建立回歸方程來(lái)研究實(shí)驗(yàn)指標(biāo)與一個(gè)(或幾個(gè))因子之間的數(shù)量關(guān)系。但大多數(shù)情況下,數(shù)量因子是不可以人為加以控制的。
兩個(gè)不同參數(shù)之間的方差就是協(xié)方差
若兩個(gè)隨機(jī)變量X和Y相互獨(dú)立,則E[(X-E(X))(Y-E(Y))]=0,因而若上述數(shù)學(xué)期望不為零,則X和Y必不是相互獨(dú)立的,亦即它們之間存在著一定的關(guān)系。
定義
E[(X-E(X))(Y-E(Y))]稱(chēng)為隨機(jī)變量X和Y的協(xié)方差,記作COV(X,Y),即COV(X,Y)=E[(X-E(X))(Y-E(Y))]。
?
COVAR_POP
功能描述:返回一對(duì)表達(dá)式的總體協(xié)方差。
SAMPLE:
?
COVAR_SAMP
功能描述:返回一對(duì)表達(dá)式的樣本協(xié)方差
SAMPLE:
?
SELECT
?a.department_id,
?a.employee_id,
?b.employee_id manager_id,
?a.first_name||' '||a.last_name employee_name,
?b.first_name||' '||b.last_name manager_name,??
?a.hire_date,
?a.salary employee_salary,
?b.salary manager_salary,
?COVAR_POP(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) AS CUM_COVP,
?COVAR_SAMP(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) AS CUM_SAMP
?FROM employees a,employees b
?WHERE a.manager_id=b.employee_id(+)
?
CORR
功能描述:返回一對(duì)表達(dá)式的相關(guān)系數(shù),它是如下的縮寫(xiě):
COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2))
從統(tǒng)計(jì)上講,相關(guān)性是變量之間關(guān)聯(lián)的強(qiáng)度,變量之間的關(guān)聯(lián)意味著在某種程度
上一個(gè)變量的值可由其它的值進(jìn)行預(yù)測(cè)。通過(guò)返回一個(gè)-1~1之間的一個(gè)數(shù),相關(guān)
系數(shù)給出了關(guān)聯(lián)的強(qiáng)度,0表示不相關(guān)。
SELECT
?a.department_id,
?a.first_name||' '||a.last_name employee_name,
?b.first_name||' '||b.last_name manager_name,??
?a.hire_date,
?a.salary employee_salary,
?b.salary manager_salary,
?CORR(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) AS CORR
?FROM employees a,employees b
?WHERE a.manager_id=b.employee_id(+)
?
Oracle分析函數(shù)——統(tǒng)計(jì)分析函數(shù)
方差和標(biāo)準(zhǔn)差:
樣本中各數(shù)據(jù)與樣本平均數(shù)的差的平方和的平均數(shù)叫做樣本方差;樣本方差的算術(shù)平方根叫做樣本標(biāo)準(zhǔn)差。樣本方差和樣本標(biāo)準(zhǔn)差都是衡量一個(gè)樣本波動(dòng)大小的量,樣本方差或樣本標(biāo)準(zhǔn)差越大,樣本數(shù)據(jù)的波動(dòng)就越大。
數(shù)學(xué)上一般用E{[X-E(X)]^2}來(lái)度量隨機(jī)變量X與其均值E(X)即期望的偏離程度,稱(chēng)為X的方差。
方差是標(biāo)準(zhǔn)差的平方
方差和標(biāo)準(zhǔn)差。方差和標(biāo)準(zhǔn)差是測(cè)算離散趨勢(shì)最重要、最常用的指標(biāo)。方差是各變量值與其均值離差平方的平均數(shù),它是測(cè)算數(shù)值型數(shù)據(jù)離散程度的最重要的方法。標(biāo)準(zhǔn)差為方差的平方根,用S表示。
?
StdDev返回expr的樣本標(biāo)準(zhǔn)偏差。它可用作聚集和分析函數(shù)。它與stddev_samp的不同之處在于,當(dāng)計(jì)算的輸入數(shù)據(jù)只有一行時(shí),stddev返回0,而stddev_samp返回null。
?
Oracle數(shù)據(jù)庫(kù)中,標(biāo)準(zhǔn)偏差計(jì)算結(jié)果與variance用作集聚函數(shù)計(jì)算結(jié)果的平方根相等。該函數(shù)參數(shù)可取任何數(shù)字類(lèi)型或是任何能隱式轉(zhuǎn)換成數(shù)字類(lèi)型的非數(shù)字類(lèi)型。
STDDEV
功能描述:計(jì)算當(dāng)前行關(guān)于組的標(biāo)準(zhǔn)偏離。(Standard Deviation)
SAMPLE:
?
STDDEV_SAMP
功能描述:該函數(shù)計(jì)算累積樣本標(biāo)準(zhǔn)偏離,并返回總體變量的平方根,其返回值與VAR_POP函數(shù)的平方根相同。(Standard Deviation-Sample)
SAMPLE:
它與stddev_samp的不同之處在于,當(dāng)計(jì)算的輸入數(shù)據(jù)只有一行時(shí),stddev返回0,而stddev_samp返回null。
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?STDDEV_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS cum_sdev
?FROM employees
?WHERE department_id in (20,30,60);
?
STDDEV和STDDEV_SAMP的區(qū)別
SELECT
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?STDDEV(salary) OVER (ORDER BY hire_date) "StdDev",
?STDDEV_SAMP(salary) OVER (ORDER BY hire_date) AS cum_sdev
?FROM employees
?
VAR_POP
功能描述:(Variance Population)該函數(shù)返回非空集合的總體變量(忽略null),VAR_POP進(jìn)行如下計(jì)算:
(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)
?
VAR_SAMP
功能描述:(Variance Sample)該函數(shù)返回非空集合的樣本變量(忽略null),VAR_POP進(jìn)行如下計(jì)算:
(SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1)
SAMPLE:
?
VARIANCE
功能描述:該函數(shù)返回表達(dá)式的變量,Oracle計(jì)算該變量如下:
如果表達(dá)式中行數(shù)為1,則返回0
如果表達(dá)式中行數(shù)大于1,則返回VAR_SAMP
SAMPLE:
?
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?STDDEV(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "STDDEV",
?STDDEV_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "STDDEV_SAMP",
?VAR_POP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "VAR_POP",
?VAR_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "VAR_SAMP",
?VARIANCE(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "VARIANCE"?
?FROM employees
?
協(xié)方差分析是建立在方差分析和回歸分析基礎(chǔ)之上的一種統(tǒng)計(jì)分析方法。
方差分析是從質(zhì)量因子的角度探討因素不同水平對(duì)實(shí)驗(yàn)指標(biāo)影響的差異。一般說(shuō)來(lái),質(zhì)量因子是可以人為控制的。
回歸分析是從數(shù)量因子的角度出發(fā),通過(guò)建立回歸方程來(lái)研究實(shí)驗(yàn)指標(biāo)與一個(gè)(或幾個(gè))因子之間的數(shù)量關(guān)系。但大多數(shù)情況下,數(shù)量因子是不可以人為加以控制的。
兩個(gè)不同參數(shù)之間的方差就是協(xié)方差
若兩個(gè)隨機(jī)變量X和Y相互獨(dú)立,則E[(X-E(X))(Y-E(Y))]=0,因而若上述數(shù)學(xué)期望不為零,則X和Y必不是相互獨(dú)立的,亦即它們之間存在著一定的關(guān)系。
定義
E[(X-E(X))(Y-E(Y))]稱(chēng)為隨機(jī)變量X和Y的協(xié)方差,記作COV(X,Y),即COV(X,Y)=E[(X-E(X))(Y-E(Y))]。
?
COVAR_POP
功能描述:返回一對(duì)表達(dá)式的總體協(xié)方差。
SAMPLE:
?
COVAR_SAMP
功能描述:返回一對(duì)表達(dá)式的樣本協(xié)方差
SAMPLE:
?
SELECT
?a.department_id,
?a.employee_id,
?b.employee_id manager_id,
?a.first_name||' '||a.last_name employee_name,
?b.first_name||' '||b.last_name manager_name,??
?a.hire_date,
?a.salary employee_salary,
?b.salary manager_salary,
?COVAR_POP(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) AS CUM_COVP,
?COVAR_SAMP(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) AS CUM_SAMP
?FROM employees a,employees b
?WHERE a.manager_id=b.employee_id(+)
?
CORR
功能描述:返回一對(duì)表達(dá)式的相關(guān)系數(shù),它是如下的縮寫(xiě):
COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2))
從統(tǒng)計(jì)上講,相關(guān)性是變量之間關(guān)聯(lián)的強(qiáng)度,變量之間的關(guān)聯(lián)意味著在某種程度
上一個(gè)變量的值可由其它的值進(jìn)行預(yù)測(cè)。通過(guò)返回一個(gè)-1~1之間的一個(gè)數(shù),相關(guān)
系數(shù)給出了關(guān)聯(lián)的強(qiáng)度,0表示不相關(guān)。
SELECT
?a.department_id,
?a.first_name||' '||a.last_name employee_name,
?b.first_name||' '||b.last_name manager_name,??
?a.hire_date,
?a.salary employee_salary,
?b.salary manager_salary,
?CORR(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) AS CORR
?FROM employees a,employees b
?WHERE a.manager_id=b.employee_id(+)
?
Oracle分析函數(shù)——統(tǒng)計(jì)分析函數(shù)
方差和標(biāo)準(zhǔn)差:
樣本中各數(shù)據(jù)與樣本平均數(shù)的差的平方和的平均數(shù)叫做樣本方差;樣本方差的算術(shù)平方根叫做樣本標(biāo)準(zhǔn)差。樣本方差和樣本標(biāo)準(zhǔn)差都是衡量一個(gè)樣本波動(dòng)大小的量,樣本方差或樣本標(biāo)準(zhǔn)差越大,樣本數(shù)據(jù)的波動(dòng)就越大。
數(shù)學(xué)上一般用E{[X-E(X)]^2}來(lái)度量隨機(jī)變量X與其均值E(X)即期望的偏離程度,稱(chēng)為X的方差。
方差是標(biāo)準(zhǔn)差的平方
方差和標(biāo)準(zhǔn)差。方差和標(biāo)準(zhǔn)差是測(cè)算離散趨勢(shì)最重要、最常用的指標(biāo)。方差是各變量值與其均值離差平方的平均數(shù),它是測(cè)算數(shù)值型數(shù)據(jù)離散程度的最重要的方法。標(biāo)準(zhǔn)差為方差的平方根,用S表示。
?
StdDev返回expr的樣本標(biāo)準(zhǔn)偏差。它可用作聚集和分析函數(shù)。它與stddev_samp的不同之處在于,當(dāng)計(jì)算的輸入數(shù)據(jù)只有一行時(shí),stddev返回0,而stddev_samp返回null。
?
Oracle數(shù)據(jù)庫(kù)中,標(biāo)準(zhǔn)偏差計(jì)算結(jié)果與variance用作集聚函數(shù)計(jì)算結(jié)果的平方根相等。該函數(shù)參數(shù)可取任何數(shù)字類(lèi)型或是任何能隱式轉(zhuǎn)換成數(shù)字類(lèi)型的非數(shù)字類(lèi)型。
STDDEV
功能描述:計(jì)算當(dāng)前行關(guān)于組的標(biāo)準(zhǔn)偏離。(Standard Deviation)
SAMPLE:
?
STDDEV_SAMP
功能描述:該函數(shù)計(jì)算累積樣本標(biāo)準(zhǔn)偏離,并返回總體變量的平方根,其返回值與VAR_POP函數(shù)的平方根相同。(Standard Deviation-Sample)
SAMPLE:
它與stddev_samp的不同之處在于,當(dāng)計(jì)算的輸入數(shù)據(jù)只有一行時(shí),stddev返回0,而stddev_samp返回null。
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?STDDEV_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS cum_sdev
?FROM employees
?WHERE department_id in (20,30,60);
?
STDDEV和STDDEV_SAMP的區(qū)別
SELECT
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?STDDEV(salary) OVER (ORDER BY hire_date) "StdDev",
?STDDEV_SAMP(salary) OVER (ORDER BY hire_date) AS cum_sdev
?FROM employees
?
VAR_POP
功能描述:(Variance Population)該函數(shù)返回非空集合的總體變量(忽略null),VAR_POP進(jìn)行如下計(jì)算:
(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)
?
VAR_SAMP
功能描述:(Variance Sample)該函數(shù)返回非空集合的樣本變量(忽略null),VAR_POP進(jìn)行如下計(jì)算:
(SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1)
SAMPLE:
?
VARIANCE
功能描述:該函數(shù)返回表達(dá)式的變量,Oracle計(jì)算該變量如下:
如果表達(dá)式中行數(shù)為1,則返回0
如果表達(dá)式中行數(shù)大于1,則返回VAR_SAMP
SAMPLE:
?
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?STDDEV(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "STDDEV",
?STDDEV_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "STDDEV_SAMP",
?VAR_POP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "VAR_POP",
?VAR_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "VAR_SAMP",
?VARIANCE(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "VARIANCE"?
?FROM employees
?
協(xié)方差分析是建立在方差分析和回歸分析基礎(chǔ)之上的一種統(tǒng)計(jì)分析方法。
方差分析是從質(zhì)量因子的角度探討因素不同水平對(duì)實(shí)驗(yàn)指標(biāo)影響的差異。一般說(shuō)來(lái),質(zhì)量因子是可以人為控制的。
回歸分析是從數(shù)量因子的角度出發(fā),通過(guò)建立回歸方程來(lái)研究實(shí)驗(yàn)指標(biāo)與一個(gè)(或幾個(gè))因子之間的數(shù)量關(guān)系。但大多數(shù)情況下,數(shù)量因子是不可以人為加以控制的。
兩個(gè)不同參數(shù)之間的方差就是協(xié)方差
若兩個(gè)隨機(jī)變量X和Y相互獨(dú)立,則E[(X-E(X))(Y-E(Y))]=0,因而若上述數(shù)學(xué)期望不為零,則X和Y必不是相互獨(dú)立的,亦即它們之間存在著一定的關(guān)系。
定義
E[(X-E(X))(Y-E(Y))]稱(chēng)為隨機(jī)變量X和Y的協(xié)方差,記作COV(X,Y),即COV(X,Y)=E[(X-E(X))(Y-E(Y))]。
?
COVAR_POP
功能描述:返回一對(duì)表達(dá)式的總體協(xié)方差。
SAMPLE:
?
COVAR_SAMP
功能描述:返回一對(duì)表達(dá)式的樣本協(xié)方差
SAMPLE:
?
SELECT
?a.department_id,
?a.employee_id,
?b.employee_id manager_id,
?a.first_name||' '||a.last_name employee_name,
?b.first_name||' '||b.last_name manager_name,??
?a.hire_date,
?a.salary employee_salary,
?b.salary manager_salary,
?COVAR_POP(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) AS CUM_COVP,
?COVAR_SAMP(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) AS CUM_SAMP
?FROM employees a,employees b
?WHERE a.manager_id=b.employee_id(+)
?
CORR
功能描述:返回一對(duì)表達(dá)式的相關(guān)系數(shù),它是如下的縮寫(xiě):
COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2))
從統(tǒng)計(jì)上講,相關(guān)性是變量之間關(guān)聯(lián)的強(qiáng)度,變量之間的關(guān)聯(lián)意味著在某種程度
上一個(gè)變量的值可由其它的值進(jìn)行預(yù)測(cè)。通過(guò)返回一個(gè)-1~1之間的一個(gè)數(shù),相關(guān)
系數(shù)給出了關(guān)聯(lián)的強(qiáng)度,0表示不相關(guān)。
SELECT
?a.department_id,
?a.first_name||' '||a.last_name employee_name,
?b.first_name||' '||b.last_name manager_name,??
?a.hire_date,
?a.salary employee_salary,
?b.salary manager_salary,
?CORR(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) AS CORR
?FROM employees a,employees b
?WHERE a.manager_id=b.employee_id(+)
?
Oracle分析函數(shù)——統(tǒng)計(jì)分析函數(shù)
方差和標(biāo)準(zhǔn)差:
樣本中各數(shù)據(jù)與樣本平均數(shù)的差的平方和的平均數(shù)叫做樣本方差;樣本方差的算術(shù)平方根叫做樣本標(biāo)準(zhǔn)差。樣本方差和樣本標(biāo)準(zhǔn)差都是衡量一個(gè)樣本波動(dòng)大小的量,樣本方差或樣本標(biāo)準(zhǔn)差越大,樣本數(shù)據(jù)的波動(dòng)就越大。
數(shù)學(xué)上一般用E{[X-E(X)]^2}來(lái)度量隨機(jī)變量X與其均值E(X)即期望的偏離程度,稱(chēng)為X的方差。
方差是標(biāo)準(zhǔn)差的平方
方差和標(biāo)準(zhǔn)差。方差和標(biāo)準(zhǔn)差是測(cè)算離散趨勢(shì)最重要、最常用的指標(biāo)。方差是各變量值與其均值離差平方的平均數(shù),它是測(cè)算數(shù)值型數(shù)據(jù)離散程度的最重要的方法。標(biāo)準(zhǔn)差為方差的平方根,用S表示。
?
StdDev返回expr的樣本標(biāo)準(zhǔn)偏差。它可用作聚集和分析函數(shù)。它與stddev_samp的不同之處在于,當(dāng)計(jì)算的輸入數(shù)據(jù)只有一行時(shí),stddev返回0,而stddev_samp返回null。
?
Oracle數(shù)據(jù)庫(kù)中,標(biāo)準(zhǔn)偏差計(jì)算結(jié)果與variance用作集聚函數(shù)計(jì)算結(jié)果的平方根相等。該函數(shù)參數(shù)可取任何數(shù)字類(lèi)型或是任何能隱式轉(zhuǎn)換成數(shù)字類(lèi)型的非數(shù)字類(lèi)型。
STDDEV
功能描述:計(jì)算當(dāng)前行關(guān)于組的標(biāo)準(zhǔn)偏離。(Standard Deviation)
SAMPLE:
?
STDDEV_SAMP
功能描述:該函數(shù)計(jì)算累積樣本標(biāo)準(zhǔn)偏離,并返回總體變量的平方根,其返回值與VAR_POP函數(shù)的平方根相同。(Standard Deviation-Sample)
SAMPLE:
它與stddev_samp的不同之處在于,當(dāng)計(jì)算的輸入數(shù)據(jù)只有一行時(shí),stddev返回0,而stddev_samp返回null。
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?STDDEV_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS cum_sdev
?FROM employees
?WHERE department_id in (20,30,60);
?
STDDEV和STDDEV_SAMP的區(qū)別
SELECT
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?STDDEV(salary) OVER (ORDER BY hire_date) "StdDev",
?STDDEV_SAMP(salary) OVER (ORDER BY hire_date) AS cum_sdev
?FROM employees
?
VAR_POP
功能描述:(Variance Population)該函數(shù)返回非空集合的總體變量(忽略null),VAR_POP進(jìn)行如下計(jì)算:
(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)
?
VAR_SAMP
功能描述:(Variance Sample)該函數(shù)返回非空集合的樣本變量(忽略null),VAR_POP進(jìn)行如下計(jì)算:
(SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1)
SAMPLE:
?
VARIANCE
功能描述:該函數(shù)返回表達(dá)式的變量,Oracle計(jì)算該變量如下:
如果表達(dá)式中行數(shù)為1,則返回0
如果表達(dá)式中行數(shù)大于1,則返回VAR_SAMP
SAMPLE:
?
SELECT
?department_id,
?first_name||' '||last_name employee_name,
?hire_date,
?salary,
?STDDEV(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "STDDEV",
?STDDEV_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "STDDEV_SAMP",
?VAR_POP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "VAR_POP",
?VAR_SAMP(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "VAR_SAMP",
?VARIANCE(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS "VARIANCE"?
?FROM employees
?
協(xié)方差分析是建立在方差分析和回歸分析基礎(chǔ)之上的一種統(tǒng)計(jì)分析方法。
方差分析是從質(zhì)量因子的角度探討因素不同水平對(duì)實(shí)驗(yàn)指標(biāo)影響的差異。一般說(shuō)來(lái),質(zhì)量因子是可以人為控制的。
回歸分析是從數(shù)量因子的角度出發(fā),通過(guò)建立回歸方程來(lái)研究實(shí)驗(yàn)指標(biāo)與一個(gè)(或幾個(gè))因子之間的數(shù)量關(guān)系。但大多數(shù)情況下,數(shù)量因子是不可以人為加以控制的。
兩個(gè)不同參數(shù)之間的方差就是協(xié)方差
若兩個(gè)隨機(jī)變量X和Y相互獨(dú)立,則E[(X-E(X))(Y-E(Y))]=0,因而若上述數(shù)學(xué)期望不為零,則X和Y必不是相互獨(dú)立的,亦即它們之間存在著一定的關(guān)系。
定義
E[(X-E(X))(Y-E(Y))]稱(chēng)為隨機(jī)變量X和Y的協(xié)方差,記作COV(X,Y),即COV(X,Y)=E[(X-E(X))(Y-E(Y))]。
?
COVAR_POP
功能描述:返回一對(duì)表達(dá)式的總體協(xié)方差。
SAMPLE:
?
COVAR_SAMP
功能描述:返回一對(duì)表達(dá)式的樣本協(xié)方差
SAMPLE:
?
SELECT
?a.department_id,
?a.employee_id,
?b.employee_id manager_id,
?a.first_name||' '||a.last_name employee_name,
?b.first_name||' '||b.last_name manager_name,??
?a.hire_date,
?a.salary employee_salary,
?b.salary manager_salary,
?COVAR_POP(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) AS CUM_COVP,
?COVAR_SAMP(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) AS CUM_SAMP
?FROM employees a,employees b
?WHERE a.manager_id=b.employee_id(+)
?
CORR
功能描述:返回一對(duì)表達(dá)式的相關(guān)系數(shù),它是如下的縮寫(xiě):
COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2))
從統(tǒng)計(jì)上講,相關(guān)性是變量之間關(guān)聯(lián)的強(qiáng)度,變量之間的關(guān)聯(lián)意味著在某種程度
上一個(gè)變量的值可由其它的值進(jìn)行預(yù)測(cè)。通過(guò)返回一個(gè)-1~1之間的一個(gè)數(shù),相關(guān)
系數(shù)給出了關(guān)聯(lián)的強(qiáng)度,0表示不相關(guān)。
SELECT
?a.department_id,
?a.first_name||' '||a.last_name employee_name,
?b.first_name||' '||b.last_name manager_name,??
?a.hire_date,
?a.salary employee_salary,
?b.salary manager_salary,
?CORR(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) AS CORR
?FROM employees a,employees b
?WHERE a.manager_id=b.employee_id(+)
?
?
Oracle分析函數(shù)——數(shù)據(jù)分布函數(shù)及報(bào)表函數(shù)
CUME_DIST
功能描述:計(jì)算一行在組中的相對(duì)位置,CUME_DIST總是返回大于0、小于或等于1的數(shù),該數(shù)表示該行在N行中的位置。例如,在一個(gè)3行的組中,返回的累計(jì)分布值為1/3、2/3、3/3
SAMPLE:下例中計(jì)算每個(gè)部門(mén)的員工按薪水排序依次累積出現(xiàn)的分布百分比
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
功能描述:將一個(gè)組分為"表達(dá)式"的散列表示,例如,如果表達(dá)式=4,則給組中的每一行分配一個(gè)數(shù)(從1到4),如果組中有20行,則給前5行分配1,給下5行分配2等等。如果組的基數(shù)不能由表達(dá)式值平均分開(kāi),則對(duì)這些行進(jìn)行分配時(shí),組中就沒(méi)有任何percentile的行數(shù)比其它percentile的行數(shù)超過(guò)一行,最低的percentile是那些擁有額外行的percentile。例如,若表達(dá)式=4,行數(shù)=21,則percentile=1的有5行,percentile=2的有5行等等。
SAMPLE:下例中把6行數(shù)據(jù)分為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(累積分配)函數(shù)類(lèi)似,對(duì)于一個(gè)組中給定的行來(lái)說(shuō),在計(jì)算那行的序號(hào)時(shí),先減1,然后除以n-1(n為組中所有的行數(shù))。該函數(shù)總是返回0~1(包括1)之間的數(shù)。
SAMPLE:下例中如果Khoo的salary為2900,則pr值為0.6,因?yàn)镽ANK函數(shù)對(duì)于等值的返回序列值是一樣的
?
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
功能描述:返回一個(gè)與輸入的分布百分比值相對(duì)應(yīng)的數(shù)據(jù)值,分布百分比的計(jì)算方法見(jiàn)函數(shù)CUME_DIST,如果沒(méi)有正好對(duì)應(yīng)的數(shù)據(jù)值,就取大于該分布值的下一個(gè)值。
注意:本函數(shù)與PERCENTILE_CONT的區(qū)別在找不到對(duì)應(yīng)的分布值時(shí)返回的替代值的計(jì)算方法不同
?
SAMPLE:下例中0.7的分布值在部門(mén)30中沒(méi)有對(duì)應(yīng)的Cume_Dist值,所以就取下一個(gè)分布值0.83333333所對(duì)應(yīng)的SALARY來(lái)替代
?
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
?
PERCENTILE_CONT
功能描述:返回一個(gè)與輸入的分布百分比值相對(duì)應(yīng)的數(shù)據(jù)值,分布百分比的計(jì)算方法見(jiàn)函數(shù)PERCENT_RANK,如果沒(méi)有正好對(duì)應(yīng)的數(shù)據(jù)值,就通過(guò)下面算法來(lái)得到值:
RN = 1+ (P*(N-1))其中P是輸入的分布百分比值,N是組內(nèi)的行數(shù)
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)
注意:本函數(shù)與PERCENTILE_DISC的區(qū)別在找不到對(duì)應(yīng)的分布值時(shí)返回的替代值的計(jì)算方法不同
算法太復(fù)雜,看不懂了L
SAMPLE:在下例中,對(duì)于部門(mén)60的Percentile_Cont值計(jì)算如下:
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, --數(shù)據(jù)分布百分比
?NTILE(4) OVER (PARTITION BY department_id ORDER BY salary) AS quartile,????--數(shù)據(jù)分布,以NTILE中的exp來(lái)計(jì)算
?PERCENT_RANK() OVER (PARTITION BY department_id ORDER BY salary) AS pr,????--數(shù)據(jù)分布百分比,從0開(kāi)始計(jì)
?PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY salary ) OVER (PARTITION BY department_id) "Percentile_Disc",?--輸入的分布百分比值相對(duì)應(yīng)的數(shù)據(jù)值
?PERCENTILE_CONT(0.7) WITHIN GROUP (ORDER BY salary) OVER (PARTITION BY department_id) "Percentile_Cont"???--表達(dá)式太復(fù)雜了,...
FROM employees
?
RATIO_TO_REPORT
功能描述:該函數(shù)計(jì)算expression/(sum(expression))的值,它給出相對(duì)于總數(shù)的百分比,即當(dāng)前行對(duì)sum(expression)的貢獻(xiàn)。
SAMPLE:下例計(jì)算每個(gè)員工的工資占該類(lèi)員工總工資的百分比
?
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
功能描述:這些線性回歸函數(shù)適合最小二乘法回歸線,有9個(gè)不同的回歸函數(shù)可使用。
REGR_SLOPE:返回斜率,等于COVAR_POP(expr1, expr2) / VAR_POP(expr2)
REGR_INTERCEPT:返回回歸線的y截距,等于
AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2)
REGR_COUNT:返回用于填充回歸線的非空數(shù)字對(duì)的數(shù)目
REGR_R2:返回回歸線的決定系數(shù),計(jì)算式為:
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:計(jì)算回歸線的自變量(expr2)的平均值,去掉了空對(duì)(expr1, expr2)后,等于AVG(expr2)
REGR_AVGY:計(jì)算回歸線的應(yīng)變量(expr1)的平均值,去掉了空對(duì)(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:下例計(jì)算1998年最后三個(gè)星期中兩種產(chǎn)品(260和270)在周末的銷(xiāo)售量中已開(kāi)發(fā)票數(shù)量和總數(shù)量的累積斜率和回歸線的截距
?
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:下例計(jì)算1998年4月每天的累積交易數(shù)量
?
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:下例計(jì)算1998年每月銷(xiāo)售量中已開(kāi)發(fā)票數(shù)量和總數(shù)量的累積回歸線決定系數(shù)
?
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:下例計(jì)算1998年12月最后兩周產(chǎn)品260的銷(xiāo)售量中已開(kāi)發(fā)票數(shù)量和總數(shù)量的累積平均值
?
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:下例計(jì)算產(chǎn)品260和270在1998年2月周末銷(xiāo)售量中已開(kāi)發(fā)票數(shù)量和總數(shù)量的累積REGR_SXY, REGR_SXX, and REGR_SYY統(tǒng)計(jì)值
?
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;
?
?
Oracle分析函數(shù)——分析函數(shù)案例
環(huán)比
環(huán)比就是現(xiàn)在的統(tǒng)計(jì)周期和上一個(gè)統(tǒng)計(jì)周期比較。例如2008年7月份與2008年6月份相比較稱(chēng)其為環(huán)比。
環(huán)比發(fā)展速度是報(bào)告期水平與前一時(shí)期水平之比,表明現(xiàn)象逐期的發(fā)展速度。如計(jì)算一年內(nèi)各月與前一個(gè)月對(duì)比,即2月比1月,3月比2月,4月比3月……12月比11月,說(shuō)明逐月的發(fā)展程度。如分析抗擊"非典"期間某些經(jīng)濟(jì)現(xiàn)象的發(fā)展趨勢(shì),環(huán)比比同比更說(shuō)明問(wèn)題。
學(xué)過(guò)統(tǒng)計(jì)或者經(jīng)濟(jì)知識(shí)的人都知道,統(tǒng)計(jì)指標(biāo)按其具體內(nèi)容、實(shí)際作用和表現(xiàn)形式可以分為總量指標(biāo)、相對(duì)指標(biāo)和平均指標(biāo)。由于采用基期的不同,發(fā)展速度可分為同比發(fā)展速度、環(huán)比發(fā)展速度和定基發(fā)展速度。簡(jiǎn)單地說(shuō),就是同比、環(huán)比與定基比,都可以用百分?jǐn)?shù)或倍數(shù)表示。
定基比發(fā)展速度,也簡(jiǎn)稱(chēng)總速度,一般是指報(bào)告期水平與某一固定時(shí)期水平之比,表明這種現(xiàn)象在較長(zhǎng)時(shí)期內(nèi)總的發(fā)展速度。同比發(fā)展速度,一般指是指本期發(fā)展水平與上年同期發(fā)展水平對(duì)比,而達(dá)到的相對(duì)發(fā)展速度。環(huán)比發(fā)展速度,一般指是指報(bào)告期水平與前一時(shí)期水平之比,表明現(xiàn)象逐期的發(fā)展速度。
同比和環(huán)比,這兩者所反映的雖然都是變化速度,但由于采用基期的不同,其反映的內(nèi)涵是完全不同的;同比與環(huán)比相比較,而不能拿同比與環(huán)比相比較;而對(duì)于同一個(gè)地方,考慮時(shí)間縱向上發(fā)展趨勢(shì)的反映,則往往要把同比與環(huán)比放在一起進(jìn)行對(duì)照
?
?
同比
英文:year-on-year
同比就是今年第n月與去年第n月比;(環(huán)比就是今年第n月與第n-1月或第n+1月比)學(xué)過(guò)統(tǒng)計(jì)或者經(jīng)濟(jì)知識(shí)的人都知道,統(tǒng)計(jì)指標(biāo)按其具體內(nèi)容、實(shí)際作用和表現(xiàn)形式可以分為總量指標(biāo)、相對(duì)指標(biāo)和平均指標(biāo)。由于采用基期的不同,發(fā)展速度可分為同比發(fā)展速度、環(huán)比發(fā)展速度和定基發(fā)展速度。簡(jiǎn)單地說(shuō),就是同比、環(huán)比與定基比,都可以用百分?jǐn)?shù)或倍數(shù)表示。
同比發(fā)展速度主要是為了消除季節(jié)變動(dòng)的影響,用以說(shuō)明本期發(fā)展水平與去年同期發(fā)展水平對(duì)比而達(dá)到的相對(duì)發(fā)展速度。如,本期2月比去年2月,本期6月比去年6月等。其計(jì)算公式為:同比發(fā)展速度=本期發(fā)展水平/去年同期發(fā)展水平×100%。在實(shí)際工作中,經(jīng)常使用這個(gè)指標(biāo),如某年、某季、某月與上年同期對(duì)比計(jì)算的發(fā)展速度,就是同比發(fā)展速度。
環(huán)比發(fā)展速度是報(bào)告期水平與前一時(shí)期水平之比,表明現(xiàn)象逐期的發(fā)展速度。如計(jì)算一年內(nèi)各月與前一個(gè)月對(duì)比,即2月比1月,3月比2月,4月比3月……12月比11月,說(shuō)明逐月的發(fā)展程度。如分析抗擊"非典"期間某些經(jīng)濟(jì)現(xiàn)象的發(fā)展趨勢(shì),環(huán)比比同比更說(shuō)明問(wèn)題。
定基比發(fā)展速度也叫總速度。是報(bào)告期水平與某一固定時(shí)期水平之比,表明這種現(xiàn)象在較長(zhǎng)時(shí)期內(nèi)總的發(fā)展速度。如,"九五"期間各年水平都以1995年水平為基期進(jìn)行對(duì)比,一年內(nèi)各月水平均以上年12月水平為基期進(jìn)行對(duì)比,就是定基發(fā)展速度。
?
?
定基比
定基比發(fā)展速度也叫總速度。是報(bào)告期水平與某一固定時(shí)期水平之比,表明這種現(xiàn)象在較長(zhǎng)時(shí)期內(nèi)總的發(fā)展速度。如,"九五"期間各年水平都以1995年水平為基期進(jìn)行對(duì)比,一年內(nèi)各月水平均以上年12月水平為基期進(jìn)行對(duì)比,就是定基發(fā)展速度。
另可參見(jiàn)同比、環(huán)比:
同比發(fā)展速度主要是為了消除季節(jié)變動(dòng)的影響,用以說(shuō)明本期發(fā)展水平與去年同期發(fā)展水平對(duì)比而達(dá)到的相對(duì)發(fā)展速度。如,本期2月比去年2月,本期6月比去年6月等。其計(jì)算公式為:同比發(fā)展速度=本期發(fā)展水平/去年同期發(fā)展水平×100%。在實(shí)際工作中,經(jīng)常使用這個(gè)指標(biāo),如某年、某季、某月與上年同期對(duì)比計(jì)算的發(fā)展速度,就是同比發(fā)展速度。
環(huán)比發(fā)展速度是報(bào)告期水平與前一時(shí)期水平之比,表明現(xiàn)象逐期的發(fā)展速度。如計(jì)算一年內(nèi)各月與前一個(gè)月對(duì)比,即2月比1月,3月比2月,4月比3月……12月比11月,說(shuō)明逐月的發(fā)展程度。如分析抗擊"非典"期間某些經(jīng)濟(jì)現(xiàn)象的發(fā)展趨勢(shì),環(huán)比比同比更說(shuō)明問(wèn)題
?
?
CREATE TABLE salaryByMonth
(
?employeeNo?varchar2(20),
?yearMonth varchar2(6),
?salary number
)
?
SELECT
?employeeno,
?yearmonth,
?salary,???
?MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY yearmonth) OVER (PARTITION BY employeeno) first_salary, --基比分析salary/first_salary??
?LAG(salary,1,0) OVER (PARTITION BY employeeno ORDER BY yearmonth) AS prev_sal,???--環(huán)比分析,與上個(gè)月份進(jìn)行比較
?LAG(salary,12,0) OVER (PARTITION BY employeeno ORDER BY yearmonth) AS prev_12_sal --同比分析,與上個(gè)年度相同月份進(jìn)行比較??
?FROM salaryByMonth
ORDER BY employeeno,yearmonth
?
--SQL常用的算法
SELECT *
?FROM salaryByMonth a
?WHERE (a.employeeno,a.salary) IN
?(
?SELECT b.employeeno,max(salary)
???FROM salaryByMonth b
??GROUP BY b.employeeno
?)
?
--用分析函數(shù)替代
SELECT distinct
?employeeno,
?MAX(salary) OVER (PARTITION BY employeeno) AS max_salary,
?FIRST_VALUE(yearmonth) OVER (PARTITION BY employeeno ORDER BY salary DESC) AS high_yearmonth????
?FROM salaryByMonth
?
?
Oracle分析函數(shù)——CUBE,ROLLUP
CUBE
功能描述:
注意:
?
ROLLUP
功能描述:
注意:
?
如果是ROLLUP(A, B, C)的話,GROUP BY順序
(A、B、C)
(A、B)
(A)
最后對(duì)全表進(jìn)行GROUP BY操作。
如果是GROUP BY CUBE(A, B, C),GROUP BY順序
(A、B、C)
(A、B)
(A、C)
(A),
(B、C)
(B)
(C),
最后對(duì)全表進(jìn)行GROUP BY操作。
?
CREATE TABLE studentscore
(
?student_name varchar2(20),
?subjects varchar2(20),
?score number
)
INSERT INTO studentscore VALUES('WBQ','ENGLISH',90);
INSERT INTO studentscore VALUES('WBQ','MATHS',95);
INSERT INTO studentscore VALUES('WBQ','CHINESE',88);
INSERT INTO studentscore VALUES('CZH','ENGLISH',80);
INSERT INTO studentscore VALUES('CZH','MATHS',90);
INSERT INTO studentscore VALUES('CZH','HISTORY',92);
INSERT INTO studentscore VALUES('CB','POLITICS',70);
INSERT INTO studentscore VALUES('CB','HISTORY',75);
INSERT INTO studentscore VALUES('LDH','POLITICS',80);
INSERT INTO studentscore VALUES('LDH','CHINESE',90);
INSERT INTO studentscore VALUES('LDH','HISTORY',95);
?
SELECT
?student_name,
?subjects,
?sum(score)
?FROM studentscore
?GROUP BY CUBE(student_name,subjects);
等同于以下標(biāo)準(zhǔn)SQL
SELECT NULL,subjects,SUM(score)
?FROM studentscore
?GROUP BY subjects
?UNION
SELECT student_name,NULL,SUM(score)
?FROM studentscore
?GROUP BY student_name
?UNION
SELECT NULL,NULL,SUM(score)
?FROM studentscore
?UNION
SELECT student_name,subjects,SUM(score)
?FROM studentscore
?GROUP BY student_name,subjects
?
SELECT
?student_name,
?subjects,
?sum(score)
?FROM studentscore
?GROUP BY ROLLUP(student_name,subjects);
?
SELECT student_name,NULL,SUM(score)
?FROM studentscore
?GROUP BY student_name
?UNION
SELECT NULL,NULL,SUM(score)
?FROM studentscore
?UNION
SELECT student_name,subjects,SUM(score)
?FROM studentscore
?GROUP BY student_name,subjects
?
?
SELECT
?grouping(student_name),
?grouping(subjects),?
?student_name,
?subjects,
?sum(score)
?FROM studentscore
?GROUP BY CUBE(student_name,subjects)
?ORDER BY 1,2;
?
SELECT
?grouping(student_name),
?grouping(subjects),?
?student_name,
?subjects,
?sum(score)
?FROM studentscore
?GROUP BY ROLLUP(student_name,subjects)
?ORDER BY 1,2;
?
SELECT
?grouping_id(student_name,subjects),??
?student_name,
?subjects,
?sum(score)
?FROM studentscore
?GROUP BY CUBE(student_name,subjects)
?ORDER BY 1;
?
SELECT
?grouping_id(student_name,subjects),??
?student_name,
?subjects,
?sum(score)
?FROM studentscore
?GROUP BY ROLLUP(student_name,subjects)
?ORDER BY 1;
?
SELECT
?grouping(student_name),
?grouping(subjects),
?CASE WHEN grouping(student_name)=0 AND grouping(subjects)=1 THEN '學(xué)生成績(jī)合計(jì)'
??????WHEN grouping(student_name)=1 AND grouping(subjects)=0 THEN '課目成績(jī)合計(jì)'
??????WHEN grouping(student_name)=1 AND grouping(subjects)=1 THEN '總???????????????計(jì)'
??????ELSE ''
?END SUMMARY,
?student_name,
?subjects,
?sum(score)
?FROM studentscore
?GROUP BY CUBE(student_name,subjects)
?ORDER BY 1,2;
?
?
本文參考Oracle官方網(wǎng)站的相關(guān)文檔,并加了一些實(shí)用例子
?
使用正規(guī)表達(dá)式編寫(xiě)更好的SQL
http://www.oracle.com/technology/global/cn/oramag/webcolumns/2003/techarticles/rischert_regexp_pt1.html
使用正則表達(dá)式編寫(xiě)更好的SQL(續(xù))
http://www.oracle.com/technology/global/cn/oramag/webcolumns/2003/techarticles/rischert_regexp_pt2.html
?
什么是正規(guī)表達(dá)式?
?
正規(guī)表達(dá)式由一個(gè)或多個(gè)字符型文字和/或元字符組成。在最簡(jiǎn)單的格式下,正規(guī)表達(dá)式僅由字符文字組成,如正規(guī)表達(dá)式cat。它被讀作字母c,接著是字母a和t,這種模式匹配cat、location和catalog之類(lèi)的字符串。元字符提供算法來(lái)確定Oracle如何處理組成一個(gè)正規(guī)表達(dá)式的字符。當(dāng)您了解了各種元字符的含義時(shí),您將體會(huì)到正規(guī)表達(dá)式用于查找和替換特定的文本數(shù)據(jù)是非常強(qiáng)大的。
?
驗(yàn)證數(shù)據(jù)、識(shí)別重復(fù)關(guān)鍵字的出現(xiàn)、檢測(cè)不必要的空格,或分析字符串只是正規(guī)表達(dá)式的許多應(yīng)用中的一部分。您可以用它們來(lái)驗(yàn)證電話號(hào)碼、郵政編碼、電子郵件地址、社會(huì)安全號(hào)碼、IP地址、文件名和路徑名等的格式。此外,您可以查找如HTML標(biāo)記、數(shù)字、日期之類(lèi)的模式,或任意文本數(shù)據(jù)中符合任意模式的任何事物,并用其它的模式來(lái)替換它們。
?
用Oracle Database?10g使用正規(guī)表達(dá)式
?
您可以使用最新引進(jìn)的Oracle SQL REGEXP_LIKE操作符和REGEXP_INSTR、REGEXP_SUBSTR以及REGEXP_REPLACE函數(shù)來(lái)發(fā)揮正規(guī)表達(dá)式的作用。您將體會(huì)到這個(gè)新的功能如何對(duì)LIKE操作符和INSTR、SUBSTR和REPLACE函數(shù)進(jìn)行了補(bǔ)充。實(shí)際上,它們類(lèi)似于已有的操作符,但現(xiàn)在增加了強(qiáng)大的模式匹配功能。被搜索的數(shù)據(jù)可以是簡(jiǎn)單的字符串或是存儲(chǔ)在數(shù)據(jù)庫(kù)字符列中的大量文本。正規(guī)表達(dá)式讓您能夠以一種您以前從未想過(guò)的方式來(lái)搜索、替換和驗(yàn)證數(shù)據(jù),并提供高度的靈活性。
?
正規(guī)表達(dá)式的基本例子
?
在使用這個(gè)新功能之前,您需要了解一些元字符的含義。句號(hào)(.)匹配一個(gè)正規(guī)表達(dá)式中的任意字符(除了換行符)。例如,正規(guī)表達(dá)式a.b匹配的字符串中首先包含字母a,接著是其它任意單個(gè)字符(除了換行符),再接著是字母b。字符串a(chǎn)xb、xaybx和abba都與之匹配,因?yàn)樵谧址须[藏了這種模式。如果您想要精確地匹配以a開(kāi)頭和以b結(jié)尾的一條三個(gè)字母的字符串,則您必須對(duì)正規(guī)表達(dá)式進(jìn)行定位。脫字符號(hào)(^)元字符指示一行的開(kāi)始,而美元符號(hào)($)指示一行的結(jié)尾(參見(jiàn)表1)。因此,正規(guī)表達(dá)式^a.b$匹配字符串a(chǎn)ab、abb或axb。將這種方式與LIKE2ù×÷·?提供的類(lèi)似的模式匹配a_b相比較,其中(_)是單字符通配符。
?
默認(rèn)情況下,一個(gè)正規(guī)表達(dá)式中的一個(gè)單獨(dú)的字符或字符列表只匹配一次。為了指示在一個(gè)正規(guī)表達(dá)式中多次出現(xiàn)的一個(gè)字符,您可以使用一個(gè)量詞,它也被稱(chēng)為重復(fù)操作符。.如果您想要得到從字母a開(kāi)始并以字母b結(jié)束的匹配模式,則您的正規(guī)表達(dá)式看起來(lái)像這樣:^a.*b$。*元字符重復(fù)前面的元字符(.)指示的匹配零次、一次或更多次。LIKE操作符的等價(jià)的模式是a%b,其中用百分號(hào)(%)來(lái)指示任意字符出現(xiàn)零次、一次或多次。
?
表2給出了重復(fù)操作符的完整列表。注意它包含了特殊的重復(fù)選項(xiàng),它們實(shí)現(xiàn)了比現(xiàn)有的LIKE通配符更大的靈活性。如果您用圓括號(hào)括住一個(gè)表達(dá)式,這將有效地創(chuàng)建一個(gè)可以重復(fù)一定次數(shù)的子表達(dá)式。例如,正規(guī)表達(dá)式b(an)*a匹配ba、bana、banana、yourbananasplit等。
?
Oracle的正規(guī)表達(dá)式實(shí)施支持POSIX(可移植操作系統(tǒng)接口)字符類(lèi),參見(jiàn)表3中列出的內(nèi)容。這意味著您要查找的字符類(lèi)型可以非常特別。假設(shè)您要編寫(xiě)一條僅查找非字母字符的LIKE條件—作為結(jié)果的WHERE子句可能不經(jīng)意就會(huì)變得非常復(fù)雜。
?
POSIX字符類(lèi)必須包含在一個(gè)由方括號(hào)([])指示的字符列表中。例如,正規(guī)表達(dá)式[[:lower:]]匹配一個(gè)小寫(xiě)字母字符,而[[:lower:]]{5}匹配五個(gè)連續(xù)的小寫(xiě)字母字符。
?
除POSIX字符類(lèi)之外,您可以將單獨(dú)的字符放在一個(gè)字符列表中。例如,正規(guī)表達(dá)式^ab[cd]ef$匹配字符串a(chǎn)bcef和abdef。必須選擇c或d。
?
除脫字符(^)和連字符(-)之外,字符列表中的大多數(shù)元字符被認(rèn)為是文字。正規(guī)表達(dá)式看起來(lái)很復(fù)雜,這是因?yàn)橐恍┰址哂须S上下文環(huán)境而定的多重含義。^就是這樣一種元字符。如果您用它作為一個(gè)字符列表的第一個(gè)字符,它代表一個(gè)字符列表的非。因此,[^[:digit:]]查找包含了任意非數(shù)字字符的模式,而^[[:digit:]]查找以數(shù)字開(kāi)始的匹配模式。連字符(-)指示一個(gè)范圍,正規(guī)表達(dá)式[a-m]匹配字母a到字母m之間的任意字母。但如果它是一個(gè)字符行中的第一個(gè)字符(如在[-afg]中),則它就代表連字符。
?
之前的一個(gè)例子介紹了使用圓括號(hào)來(lái)創(chuàng)建一個(gè)子表達(dá)式;它們?cè)试S您通過(guò)輸入更替元字符來(lái)輸入可更替的選項(xiàng),這些元字符由豎線(|)分開(kāi)。
?
例如,正規(guī)表達(dá)式t(a|e|i)n允許字母t和n之間的三種可能的字符更替。匹配模式包括如tan、ten、tin和Pakistan之類(lèi)的字,但不包括teen、mountain或tune。作為另一種選擇,正規(guī)表達(dá)式t(a|e|i)n也可以表示為一個(gè)字符列表t[aei]n。表4匯總了這些元字符。雖然存在更多的元字符,但這個(gè)簡(jiǎn)明的概述足夠用來(lái)理解這篇文章使用的正規(guī)表達(dá)式。
?
REGEXP_LIKE操作符
?
REGEXP_LIKE操作符向您介紹在Oracle數(shù)據(jù)庫(kù)中使用時(shí)的正規(guī)表達(dá)式功能。表5列出了REGEXP_LIKE的語(yǔ)法。
?
下面的SQL查詢(xún)的WHERE子句顯示了REGEXP_LIKE操作符,它在ZIP列中搜索滿足正規(guī)表達(dá)式[^[:digit:]]的模式。它將檢索ZIPCODE表中的那些ZIP列值包含了任意非數(shù)字字符的行。
?
SELECT zip
FROM zipcode
WHERE REGEXP_LIKE(zip, '[^[:digit:]]')
ZIP
-----
ab123
123xy
007ab
abcxy
?
這個(gè)正規(guī)表達(dá)式的例子僅由元字符組成,更具體來(lái)講是被冒號(hào)和方括號(hào)分隔的POSIX字符類(lèi)digit。第二組方括號(hào)(如[^[:digit:]]中所示)包括了一個(gè)字符類(lèi)列表。如前文所述,需要這樣做是因?yàn)槟豢梢詫OSIX字符類(lèi)用于構(gòu)建一個(gè)字符列表。
?
REGEXP_INSTR函數(shù)
?
這個(gè)函數(shù)返回一個(gè)模式的起始位置,因此它的功能非常類(lèi)似于INSTR函數(shù)。新的REGEXP_INSTR函數(shù)的語(yǔ)法在表6中給出。這兩個(gè)函數(shù)之間的主要區(qū)別是,REGEXP_INSTR讓您指定一種模式,而不是一個(gè)特定的搜索字符串;因而它提供了更多的功能。接下來(lái)的示例使用REGEXP_INSTR來(lái)返回字符串Joe Smith, 10045 Berry Lane, San Joseph, CA 91234中的五位郵政編碼模式的起始位置。如果正規(guī)表達(dá)式被寫(xiě)為[[:digit:]]{5},則您將得到門(mén)牌號(hào)的起始位置而不是郵政編碼的,因?yàn)?0045是第一次出現(xiàn)五個(gè)連續(xù)數(shù)字。因此,您必須將表達(dá)式定位到該行的末尾,正如$元字符所示,該函數(shù)將顯示郵政編碼的起始位置,而不管門(mén)牌號(hào)的數(shù)字個(gè)數(shù)。
?
SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234',
'[[:digit:]]{5}$')
AS rx_instr
FROM dual
RX_INSTR
----------
45
?
編寫(xiě)更復(fù)雜的模式
?
讓我們?cè)谇耙粋€(gè)例子的郵政編碼模式上展開(kāi),以便包含一個(gè)可選的四位數(shù)字模式。您的模式現(xiàn)在可能看起來(lái)像這樣:[[:digit:]]{5}(-[[:digit:]]{4})?$。如果您的源字符串以5位郵政編碼或5位+ 4位郵政編碼的格式結(jié)束,則您將能夠顯示該模式的起始位置。
?
SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234-1234',
' [[:digit:]]{5}(-[[:digit:]]{4})?$')
AS starts_at
FROM dual
STARTS_AT
----------
44
?
在這個(gè)示例中,括弧里的子表達(dá)式(-[[:digit:]]{4})將按?重復(fù)操作符的指示重復(fù)零次或一次。此外,企圖用傳統(tǒng)的SQL函數(shù)來(lái)實(shí)現(xiàn)相同的結(jié)果甚至對(duì)SQL專(zhuān)家也是一個(gè)挑戰(zhàn)。為了更好地說(shuō)明這個(gè)正規(guī)表達(dá)式示例的不同組成部分,表7包含了一個(gè)對(duì)單個(gè)文字和元字符的描述。
?
REGEXP_SUBSTR函數(shù)
?
SUBSTR函數(shù)的REGEXP_SUBSTR函數(shù)用來(lái)提取一個(gè)字符串的一部分。表8顯示了這個(gè)新函數(shù)的語(yǔ)法。在下面的示例中,匹配模式[^,]*的字符串將被返回。該正規(guī)表達(dá)式搜索其后緊跟著空格的一個(gè)逗號(hào);然后按[^,]*的指示搜索零個(gè)或更多個(gè)不是逗號(hào)的字符,最后查找另一個(gè)逗號(hào)。這種模式看起來(lái)有點(diǎn)像一個(gè)用逗號(hào)分隔的值字符串。
?
SELECT REGEXP_SUBSTR('first field, second field , third field',
', [^,]*,')
FROM dual
REGEXP_SUBSTR('FIR
------------------
, second field ,
?
REGEXP_REPLACE函數(shù)
?
讓我們首先看一下傳統(tǒng)的REPLACE SQL函數(shù),它把一個(gè)字符串用另一個(gè)字符串來(lái)替換。假設(shè)您的數(shù)據(jù)在正文中有不必要的空格,您希望用單個(gè)空格來(lái)替換它們。利用REPLACE函數(shù),您需要準(zhǔn)確地列出您要替換多少個(gè)空格。然而,多余空格的數(shù)目在正文的各處可能不是相同的。下面的示例在Joe和Smith之間有三個(gè)空格。REPLACE函數(shù)的參數(shù)指定要用一個(gè)空格來(lái)替換兩個(gè)空格。在這種情況下,結(jié)果在原來(lái)的字符串的Joe和Smith之間留下了一個(gè)額外的空格。
?
SELECT REPLACE('Joe Smith',' ', ' ')
AS replace
FROM dual
REPLACE
---------
Joe Smith
?
REGEXP_REPLACE函數(shù)把替換功能向前推進(jìn)了一步,其語(yǔ)法在表9中列出。以下查詢(xún)用單個(gè)空格替換了任意兩個(gè)或更多的空格。( )子表達(dá)式包含了單個(gè)空格,它可以按{2,}的指示重復(fù)兩次或更多次。
?
SELECT REGEXP_REPLACE('Joe Smith',
'( ){2,}', ' ')
AS RX_REPLACE
FROM dual
RX_REPLACE
----------
Joe Smith
?
'^'匹配輸入字符串的開(kāi)始位置,在方括號(hào)表達(dá)式中使用,此時(shí)它表示不接受該字符集合。
'$'匹配輸入字符串的結(jié)尾位置。如果設(shè)置了RegExp對(duì)象的Multiline屬性,則$也匹配'n'或'r'。
'.'匹配除換行符n之外的任何單字符。
'?'匹配前面的子表達(dá)式零次或一次。
'*'匹配前面的子表達(dá)式零次或多次。
'+'匹配前面的子表達(dá)式一次或多次。
'( )'標(biāo)記一個(gè)子表達(dá)式的開(kāi)始和結(jié)束位置。
'[]'標(biāo)記一個(gè)中括號(hào)表達(dá)式。
'{m,n}'一個(gè)精確地出現(xiàn)次數(shù)范圍,m=<出現(xiàn)次數(shù)<=n,'{m}'表示出現(xiàn)m次,'{m,}'表示至少出現(xiàn)m次。
'|'指明兩項(xiàng)之間的一個(gè)選擇。例子'^([a-z]+|[0-9]+)$'表示所有小寫(xiě)字母或數(shù)字組合成的字符串。
num匹配num,其中num是一個(gè)正整數(shù)。對(duì)所獲取的匹配的引用。
?
create table TEST
(
?MC VARCHAR2(60)
);
insert into TEST (MC) values ('b0');
insert into TEST (MC) values ('0b');
insert into TEST (MC) values ('1234-233-3223-2323');
insert into TEST (MC) values ('123-45-5678');
insert into TEST (MC) values ('123-56-1234567890');
insert into TEST (MC) values ('123456789');
insert into TEST (MC) values ('idadfa');
insert into TEST (MC) values ('[a');
insert into TEST (MC) values ('[i');
insert into TEST (MC) values ('[a-c]');
insert into TEST (MC) values ('[a-c]a');
insert into TEST (MC) values ('a[a-c]');
insert into TEST (MC) values ('[bdd-a]');
insert into TEST (MC) values ('[adddddd');
insert into TEST (MC) values ('[eeeea]');
insert into TEST (MC) values ('[eeeee]');
insert into TEST (MC) values ('[b]');
insert into TEST (MC) values ('112233445566778899');
insert into TEST (MC) values ('22113344 5566778899');
insert into TEST (MC) values ('991122334455667788');
insert into TEST (MC) values ('aabbccddee');
insert into TEST (MC) values ('bbaaaccddee');
insert into TEST (MC) values ('eeaabbccdd');
insert into TEST (MC) values ('ab123');
insert into TEST (MC) values ('123xy');
insert into TEST (MC) values ('007ab');
insert into TEST (MC) values ('abcxy');
insert into TEST (MC) values ('The final test is is is how to find duplicate words.');
commit;
select 1,'^[:digit:]',mc from test where regexp_like(mc,'^[:digit:]')?--以':digit'中的任何一個(gè)字符開(kāi)頭的字符串
union
select 2,'[^[:digit:]]',mc from test where regexp_like(mc,'[^[:digit:]]') --任何含有非數(shù)字的字符列表
union
select 3,'^[[:digit:]]',mc from test where regexp_like(mc,'^[[:digit:]]') --數(shù)字開(kāi)頭
union
select 4,'^[^[:digit:]]',mc from test where regexp_like(mc,'^[^[:digit:]]') --包含任何非數(shù)字開(kāi)頭的
union
select 5,'[[:digit:]]',mc from test where regexp_like(mc,'[[:digit:]]') --任何含有數(shù)字的字符列表
?
?
create table email
( email varchar2(100)
)
insert into email values('windboy@vip.sina.com');
insert into email values('windboy@sina.com');
insert into email values('window2007@vip.sina.com');
insert into email values('21com@sina.com');
insert into email values('windboy@163.com');
insert into email values('test@mail.vip.sina.com');
insert into email values('test.mail.vip.sina.com');
insert into email values('test');
commit;
select * from email where REGEXP_LIKE(email,'^[[:alnum:]]+@([[:alnum:]]).+');
?
?
關(guān)于正則表達(dá)式的后向引用,暫時(shí)還是沒(méi)法理解
select 0,REGEXP_REPLACE('Ellen Hildi Smith','(.*) (.*) (.*)', '\11\22\33') from dual
union
select 1,REGEXP_REPLACE('Ellen Hildi Smith','(.*)(.*)(.*)', '\11\22\33') from dual?--2,3
union
select 2,REGEXP_REPLACE('Ellen Hildi Smith','(.*)(.*) (.*)', '\11\22\33') from dual?--2
union
select 3,REGEXP_REPLACE('Ellen Hildi Smith','(.*) (.*)(.*)', '\11\22\33') from dual?--3
union
select 4,REGEXP_REPLACE('EllenHildi Smith','(.*) (.*) (.*)', '\11\22\33') from dual
union
select 5,REGEXP_REPLACE('EllenHildi Smith','(.*)(.*)(.*)', '\11\22\33') from dual?--2,3
union
select 6,REGEXP_REPLACE('EllenHildi Smith','(.*)(.*) (.*)', '\11\22\33') from dual?--2
union
select 7,REGEXP_REPLACE('EllenHildi Smith','(.*) (.*)(.*)', '\11\22\33') from dual?--3
union
select 8,REGEXP_REPLACE('Ellen HildiSmith','(.*) (.*) (.*)', '\11\22\33') from dual
union
select 9,REGEXP_REPLACE('Ellen HildiSmith','(.*)(.*)(.*)', '\11\22\33') from dual?--2,3
union
select 10,REGEXP_REPLACE('Ellen HildiSmith','(.*)(.*) (.*)', '\11\22\33') from dual?--2
union
select 11,REGEXP_REPLACE('Ellen HildiSmith','(.*) (.*)(.*)', '\11\22\33') from dual?--3
?
?
-- 'u', 'U' -返回全是大寫(xiě)的字符串
-- 'l', 'L' -返回全是小寫(xiě)的字符串
-- 'a', 'A' -返回大小寫(xiě)結(jié)合的字符串
-- 'x', 'X' -返回全是大寫(xiě)和數(shù)字的字符串
-- 'p', 'P' -返回鍵盤(pán)上出現(xiàn)字符的隨機(jī)組合
SELECT
?trunc(dbms_random.value(1,101)),
?DBMS_RANDOM.string('~',5),
?DBMS_RANDOM.string('l',5),
?DBMS_RANDOM.string('L',5),?
?DBMS_RANDOM.string('a',5),
?DBMS_RANDOM.string('A',5),
?DBMS_RANDOM.string('u',5),
?DBMS_RANDOM.string('U',5),?
?DBMS_RANDOM.string('x',5),
?DBMS_RANDOM.string('X',5),
?DBMS_RANDOM.string('p',5),
?DBMS_RANDOM.string('P',5)???
from
(
SELECT level,ROWNUM rn
?FROM DUAL
CONNECT BY ROWNUM<=1001
)
轉(zhuǎn)載網(wǎng)站:http://blog.csdn.net/fujiakai/article/details/51066389
?
posted on 2017-10-13 09:13 瀚城老爺子 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/hclyz/p/7659419.html
總結(jié)
以上是生活随笔為你收集整理的Oracle所有分析函数转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python 面向对象(二)
- 下一篇: android.util.Base64