Oracle分析函數
Oracle分析函數——函數列表
SUM :該函數計算組中表達式的累積和
MIN :在一個(gè)組中的數據窗口中查找表達式的最小值
MAX :在一個(gè)組中的數據窗口中查找表達式的最大值
AVG :用于計算一個(gè)組和數據窗口內表達式的平均值。
COUNT :對一組內發(fā)生的事情進(jìn)行累積計數
-------------------------------------------------------------------------------------------------
RANK :根據ORDER BY子句中表達式的值,從查詢(xún)返回的每一行,計算它們與其它行的相對位置
DENSE_RANK :根據ORDER BY子句中表達式的值,從查詢(xún)返回的每一行,計算它們與其它行的相對位置
FIRST :從DENSE_RANK返回的集合中取出排在最前面的一個(gè)值的行
LAST :從DENSE_RANK返回的集合中取出排在最后面的一個(gè)值的行
FIRST_VALUE :返回組中數據窗口的第一個(gè)值
LAST_VALUE :返回組中數據窗口的最后一個(gè)值。
LAG :可以訪(fǎng)問(wèn)結果集中的其它行而不用進(jìn)行自連接
LEAD :LEAD與LAG相反,LEAD可以訪(fǎng)問(wèn)組中當前行之后的行
ROW_NUMBER:返回有序組中一行的偏移量,從而可用于按特定標準排序的行號
-------------------------------------------------------------------------------------------------
STDDEV :計算當前行關(guān)于組的標準偏離
STDDEV_POP:該函數計算總體標準偏離,并返回總體變量的平方根
STDDEV_SAMP:該函數計算累積樣本標準偏離,并返回總體變量的平方根
VAR_POP :該函數返回非空集合的總體變量(忽略null)
VAR_SAMP :該函數返回非空集合的樣本變量(忽略null)
VARIANCE :如果表達式中行數為1,則返回0,如果表達式中行數大于1,則返回VAR_SAMP
COVAR_POP :返回一對表達式的總體協(xié)方差
COVAR_SAMP:返回一對表達式的樣本協(xié)方差
CORR :返回一對表達式的相關(guān)系數
-------------------------------------------------------------------------------------------------
CUME_DIST :計算一行在組中的相對位置
NTILE :將一個(gè)組分為"表達式"的散列表示
PERCENT_RANK:和CUME_DIST(累積分配)函數類(lèi)似
PERCENTILE_DISC:返回一個(gè)與輸入的分布百分比值相對應的數據值
PERCENTILE_CONT:返回一個(gè)與輸入的分布百分比值相對應的數據值
RATIO_TO_REPORT:該函數計算expression/(sum(expression))的值,它給出相對于總數的百分比
REGR_ (Linear Regression) Functions:這些線(xiàn)性回歸函數適合最小二乘法回歸線(xiàn),有9個(gè)不同的回歸函數可使用
-------------------------------------------------------------------------------------------------
CUBE :按照OLAP的CUBE方式進(jìn)行數據統計,即各個(gè)維度均需統計
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
ITPUB個(gè)人空間8ZX0m;Bf
oracle分析函數的語(yǔ)法:
function_name(arg1,arg2,...)
over
(<partition-clause> <order-by-clause ><windowing clause>)
說(shuō)明:
1. partition-clause 數據記錄集分組
2. order-by-clause 數據記錄集排序
3. windowing clause 功能非常強大、比較復雜,定義分析函數在操作行的集合。有三種開(kāi)窗方式: range、row、specifying。
--Partition by,按相應的值(manager_id)進(jìn)行分組統計
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按相應的值(hire_date)進(jìn)行排序并累計統計
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首先按相應的值(manager_id,hire_date)排序,并按order by的值(hire_date)進(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)
FROM employees;
--Partition by Order by首先按相應的值(manager_id,hire_date)排序,并按order by的值(hire_date)進(jìn)行累計統計
--該平均值由當前員工和與之具有相同經(jīng)理的前一個(gè)和后兩個(gè)三者的平均數得來(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首先按相應的值(manager_id,hire_date)排序,并按order by的值(hire_date)進(jìn)行累計統計
--該平均值由當前員工和與之具有相同經(jīng)理,并且雇用時(shí)間在該員工時(shí)間之前的50天以?xún)群驮谠搯T工之后的150天之內員工的薪水的平均值
--range為取值范圍,估計只有數字和日期能夠進(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首先按相應的值(manager_id,hire_date)排序,并按order by的值(hire_date)進(jìn)行累計統計
--該平均值由當前員工和與之具有相同經(jīng)理的平均值
--每行對應的數據窗口是從第一行到最后一行
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分析函數——SUM,AVG,MIN,MAX,COUNT SUM 功能描述:該函數計算組中表達式的累積和。 SAMPLE:下例計算同一經(jīng)理下員工的薪水累積值 MIN 功能描述:在一個(gè)組中的數據窗口中查找表達式的最小值。 SAMPLE:下面例子中dept_min返回當前行所在部門(mén)的最小薪水值 MAX 功能描述:在一個(gè)組中的數據窗口中查找表達式的最大值。 SAMPLE:下面例子中dept_max返回當前行所在部門(mén)的最大薪水值 AVG 功能描述:用于計算一個(gè)組和數據窗口內表達式的平均值。 SAMPLE:下面的例子中列c_mavg計算員工表中每個(gè)員工的平均薪水報告 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 功能描述:對一組內發(fā)生的事情進(jìn)行累積計數,如果指定*或一些非空常數,count將對所有行計數,如果指定一個(gè)表達式,count返回表達式非空賦值的計數,當有相同值出現時(shí),這些相等的值都會(huì )被納入被計算的值;可以使用DISTINCT來(lái)記錄去掉一組中完全相同的數據后出現的行數。 SAMPLE:下面例子中計算每個(gè)員工在按薪水排序中當前行附近薪水在[n-50,n+150]之間的行數,n表示當前行的薪水 例如,Philtanker的薪水2200,排在他之前的行中薪水大于等于2200-50的有1行,排在他之后的行中薪水小于等于2200+150的行沒(méi)有,所以count計數值cnt3為2(包括自己當前行);cnt2值相當于小于等于當前行的SALARY值的所有行數 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分析函數——函數RANK,DENSE_RANK,FIRST,LAST… RANK 功能描述:根據ORDER BY子句中表達式的值,從查詢(xún)返回的每一行,計算它們與其它行的相對位置。組內的數據按ORDER BY子句排序,然后給每一行賦一個(gè)號,從而形成一個(gè)序列,該序列從1開(kāi)始,往后累加。每次ORDER BY表達式的值發(fā)生變化時(shí),該序列也隨之增加。有同樣值的行得到同樣的數字序號(認為null時(shí)相等的)。然而,如果兩行的確得到同樣的排序,則序數將隨后跳躍。若兩行序數為1,則沒(méi)有序數2,序列將給組中的下一行分配值3,DENSE_RANK則沒(méi)有任何跳躍。 SAMPLE:下例中計算每個(gè)員工按部門(mén)分區再按薪水排序,依次出現的序列號(注意與DENSE_RANK函數的區別) DENSE_RANK 功能描述:根據ORDER BY子句中表達式的值,從查詢(xún)返回的每一行,計算它們與其它行的相對位置。組內的數據按ORDER BY子句排序,然后給每一行賦一個(gè)號,從而形成一個(gè)序列,該序列從1開(kāi)始,往后累加。每次ORDER BY表達式的值發(fā)生變化時(shí),該序列也隨之增加。有同樣值的行得到同樣的數字序號(認為null時(shí)相等的)。密集的序列返回的時(shí)沒(méi)有間隔的數 SAMPLE:下例中計算每個(gè)員工按部門(mén)分區再按薪水排序,依次出現的序列號(注意與RANK函數的區別) 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ù)平方根叫做樣本標準差。樣本方差和樣本標準差都是衡量一個(gè)樣本波動(dòng)大小的量,樣本方差或樣本標準差越大,樣本數據的波動(dòng)就越大。 數學(xué)上一般用E{[X-E(X)]^2}來(lái)度量隨機變量X與其均值E(X)即期望的偏離程度,稱(chēng)為X的方差。 方差是標準差的平方 方差和標準差。方差和標準差是測算離散趨勢最重要、最常用的指標。方差是各變量值與其均值離差平方的平均數,它是測算數值型數據離散程度的最重要的方法。標準差為方差的平方根,用S表示。 StdDev返回expr的樣本標準偏差。它可用作聚集和分析函數。它與stddev_samp的不同之處在于,當計算的輸入數據只有一行時(shí),stddev返回0,而stddev_samp返回null。 Oracle數據庫中,標準偏差計算結果與variance用作集聚函數計算結果的平方根相等。該函數參數可取任何數字類(lèi)型或是任何能隱式轉換成數字類(lèi)型的非數字類(lèi)型。 STDDEV 功能描述:計算當前行關(guān)于組的標準偏離。(Standard Deviation) SAMPLE: STDDEV_SAMP 功能描述:該函數計算累積樣本標準偏離,并返回總體變量的平方根,其返回值與VAR_POP函數的平方根相同。(Standard Deviation-Sample) SAMPLE: 它與stddev_samp的不同之處在于,當計算的輸入數據只有一行時(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的區別 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)該函數返回非空集合的總體變量(忽略null),VAR_POP進(jìn)行如下計算: (SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr) VAR_SAMP 功能描述:(Variance Sample)該函數返回非空集合的樣本變量(忽略null),VAR_POP進(jìn)行如下計算: (SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1) SAMPLE: VARIANCE 功能描述:該函數返回表達式的變量,Oracle計算該變量如下: 如果表達式中行數為1,則返回0 如果表達式中行數大于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é)方差分析是建立在方差分析和回歸分析基礎之上的一種統計分析方法。 方差分析是從質(zhì)量因子的角度探討因素不同水平對實(shí)驗指標影響的差異。一般說(shuō)來(lái),質(zhì)量因子是可以人為控制的。 回歸分析是從數量因子的角度出發(fā),通過(guò)建立回歸方程來(lái)研究實(shí)驗指標與一個(gè)(或幾個(gè))因子之間的數量關(guān)系。但大多數情況下,數量因子是不可以人為加以控制的。 兩個(gè)不同參數之間的方差就是協(xié)方差 若兩個(gè)隨機變量X和Y相互獨立,則E[(X-E(X))(Y-E(Y))]=0,因而若上述數學(xué)期望不為零,則X和Y必不是相互獨立的,亦即它們之間存在著(zhù)一定的關(guān)系。 定義 E[(X-E(X))(Y-E(Y))]稱(chēng)為隨機變量X和Y的協(xié)方差,記作COV(X,Y),即COV(X,Y)=E[(X-E(X))(Y-E(Y))]。 COVAR_POP 功能描述:返回一對表達式的總體協(xié)方差。 SAMPLE: COVAR_SAMP 功能描述:返回一對表達式的樣本協(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 功能描述:返回一對表達式的相關(guān)系數,它是如下的縮寫(xiě): COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2)) 從統計上講,相關(guān)性是變量之間關(guān)聯(lián)的強度,變量之間的關(guān)聯(lián)意味著(zhù)在某種程度 上一個(gè)變量的值可由其它的值進(jìn)行預測。通過(guò)返回一個(gè)-1~1之間的一個(gè)數,相關(guān) 系數給出了關(guān)聯(lián)的強度,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ù)平方根叫做樣本標準差。樣本方差和樣本標準差都是衡量一個(gè)樣本波動(dòng)大小的量,樣本方差或樣本標準差越大,樣本數據的波動(dòng)就越大。 數學(xué)上一般用E{[X-E(X)]^2}來(lái)度量隨機變量X與其均值E(X)即期望的偏離程度,稱(chēng)為X的方差。 方差是標準差的平方 方差和標準差。方差和標準差是測算離散趨勢最重要、最常用的指標。方差是各變量值與其均值離差平方的平均數,它是測算數值型數據離散程度的最重要的方法。標準差為方差的平方根,用S表示。 StdDev返回expr的樣本標準偏差。它可用作聚集和分析函數。它與stddev_samp的不同之處在于,當計算的輸入數據只有一行時(shí),stddev返回0,而stddev_samp返回null。 Oracle數據庫中,標準偏差計算結果與variance用作集聚函數計算結果的平方根相等。該函數參數可取任何數字類(lèi)型或是任何能隱式轉換成數字類(lèi)型的非數字類(lèi)型。 STDDEV 功能描述:計算當前行關(guān)于組的標準偏離。(Standard Deviation) SAMPLE: STDDEV_SAMP 功能描述:該函數計算累積樣本標準偏離,并返回總體變量的平方根,其返回值與VAR_POP函數的平方根相同。(Standard Deviation-Sample) SAMPLE: 它與stddev_samp的不同之處在于,當計算的輸入數據只有一行時(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的區別 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)該函數返回非空集合的總體變量(忽略null),VAR_POP進(jìn)行如下計算: (SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr) VAR_SAMP 功能描述:(Variance Sample)該函數返回非空集合的樣本變量(忽略null),VAR_POP進(jìn)行如下計算: (SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1) SAMPLE: VARIANCE 功能描述:該函數返回表達式的變量,Oracle計算該變量如下: 如果表達式中行數為1,則返回0 如果表達式中行數大于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é)方差分析是建立在方差分析和回歸分析基礎之上的一種統計分析方法。 方差分析是從質(zhì)量因子的角度探討因素不同水平對實(shí)驗指標影響的差異。一般說(shuō)來(lái),質(zhì)量因子是可以人為控制的。 回歸分析是從數量因子的角度出發(fā),通過(guò)建立回歸方程來(lái)研究實(shí)驗指標與一個(gè)(或幾個(gè))因子之間的數量關(guān)系。但大多數情況下,數量因子是不可以人為加以控制的。 兩個(gè)不同參數之間的方差就是協(xié)方差 若兩個(gè)隨機變量X和Y相互獨立,則E[(X-E(X))(Y-E(Y))]=0,因而若上述數學(xué)期望不為零,則X和Y必不是相互獨立的,亦即它們之間存在著(zhù)一定的關(guān)系。 定義 E[(X-E(X))(Y-E(Y))]稱(chēng)為隨機變量X和Y的協(xié)方差,記作COV(X,Y),即COV(X,Y)=E[(X-E(X))(Y-E(Y))]。 COVAR_POP 功能描述:返回一對表達式的總體協(xié)方差。 SAMPLE: COVAR_SAMP 功能描述:返回一對表達式的樣本協(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 功能描述:返回一對表達式的相關(guān)系數,它是如下的縮寫(xiě): COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2)) 從統計上講,相關(guān)性是變量之間關(guān)聯(lián)的強度,變量之間的關(guān)聯(lián)意味著(zhù)在某種程度 上一個(gè)變量的值可由其它的值進(jìn)行預測。通過(guò)返回一個(gè)-1~1之間的一個(gè)數,相關(guān) 系數給出了關(guān)聯(lián)的強度,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ù)平方根叫做樣本標準差。樣本方差和樣本標準差都是衡量一個(gè)樣本波動(dòng)大小的量,樣本方差或樣本標準差越大,樣本數據的波動(dòng)就越大。 數學(xué)上一般用E{[X-E(X)]^2}來(lái)度量隨機變量X與其均值E(X)即期望的偏離程度,稱(chēng)為X的方差。 方差是標準差的平方 方差和標準差。方差和標準差是測算離散趨勢最重要、最常用的指標。方差是各變量值與其均值離差平方的平均數,它是測算數值型數據離散程度的最重要的方法。標準差為方差的平方根,用S表示。 StdDev返回expr的樣本標準偏差。它可用作聚集和分析函數。它與stddev_samp的不同之處在于,當計算的輸入數據只有一行時(shí),stddev返回0,而stddev_samp返回null。 Oracle數據庫中,標準偏差計算結果與variance用作集聚函數計算結果的平方根相等。該函數參數可取任何數字類(lèi)型或是任何能隱式轉換成數字類(lèi)型的非數字類(lèi)型。 STDDEV 功能描述:計算當前行關(guān)于組的標準偏離。(Standard Deviation) SAMPLE: STDDEV_SAMP 功能描述:該函數計算累積樣本標準偏離,并返回總體變量的平方根,其返回值與VAR_POP函數的平方根相同。(Standard Deviation-Sample) SAMPLE: 它與stddev_samp的不同之處在于,當計算的輸入數據只有一行時(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的區別 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)該函數返回非空集合的總體變量(忽略null),VAR_POP進(jìn)行如下計算: (SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr) VAR_SAMP 功能描述:(Variance Sample)該函數返回非空集合的樣本變量(忽略null),VAR_POP進(jìn)行如下計算: (SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1) SAMPLE: VARIANCE 功能描述:該函數返回表達式的變量,Oracle計算該變量如下: 如果表達式中行數為1,則返回0 如果表達式中行數大于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é)方差分析是建立在方差分析和回歸分析基礎之上的一種統計分析方法。 方差分析是從質(zhì)量因子的角度探討因素不同水平對實(shí)驗指標影響的差異。一般說(shuō)來(lái),質(zhì)量因子是可以人為控制的。 回歸分析是從數量因子的角度出發(fā),通過(guò)建立回歸方程來(lái)研究實(shí)驗指標與一個(gè)(或幾個(gè))因子之間的數量關(guān)系。但大多數情況下,數量因子是不可以人為加以控制的。 兩個(gè)不同參數之間的方差就是協(xié)方差 若兩個(gè)隨機變量X和Y相互獨立,則E[(X-E(X))(Y-E(Y))]=0,因而若上述數學(xué)期望不為零,則X和Y必不是相互獨立的,亦即它們之間存在著(zhù)一定的關(guān)系。 定義 E[(X-E(X))(Y-E(Y))]稱(chēng)為隨機變量X和Y的協(xié)方差,記作COV(X,Y),即COV(X,Y)=E[(X-E(X))(Y-E(Y))]。 COVAR_POP 功能描述:返回一對表達式的總體協(xié)方差。 SAMPLE: COVAR_SAMP 功能描述:返回一對表達式的樣本協(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 功能描述:返回一對表達式的相關(guān)系數,它是如下的縮寫(xiě): COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2)) 從統計上講,相關(guān)性是變量之間關(guān)聯(lián)的強度,變量之間的關(guān)聯(lián)意味著(zhù)在某種程度 上一個(gè)變量的值可由其它的值進(jìn)行預測。通過(guò)返回一個(gè)-1~1之間的一個(gè)數,相關(guān) 系數給出了關(guān)聯(lián)的強度,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ù)平方根叫做樣本標準差。樣本方差和樣本標準差都是衡量一個(gè)樣本波動(dòng)大小的量,樣本方差或樣本標準差越大,樣本數據的波動(dòng)就越大。 數學(xué)上一般用E{[X-E(X)]^2}來(lái)度量隨機變量X與其均值E(X)即期望的偏離程度,稱(chēng)為X的方差。 方差是標準差的平方 方差和標準差。方差和標準差是測算離散趨勢最重要、最常用的指標。方差是各變量值與其均值離差平方的平均數,它是測算數值型數據離散程度的最重要的方法。標準差為方差的平方根,用S表示。 StdDev返回expr的樣本標準偏差。它可用作聚集和分析函數。它與stddev_samp的不同之處在于,當計算的輸入數據只有一行時(shí),stddev返回0,而stddev_samp返回null。 Oracle數據庫中,標準偏差計算結果與variance用作集聚函數計算結果的平方根相等。該函數參數可取任何數字類(lèi)型或是任何能隱式轉換成數字類(lèi)型的非數字類(lèi)型。 STDDEV 功能描述:計算當前行關(guān)于組的標準偏離。(Standard Deviation) SAMPLE: STDDEV_SAMP 功能描述:該函數計算累積樣本標準偏離,并返回總體變量的平方根,其返回值與VAR_POP函數的平方根相同。(Standard Deviation-Sample) SAMPLE: 它與stddev_samp的不同之處在于,當計算的輸入數據只有一行時(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的區別 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)該函數返回非空集合的總體變量(忽略null),VAR_POP進(jìn)行如下計算: (SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr) VAR_SAMP 功能描述:(Variance Sample)該函數返回非空集合的樣本變量(忽略null),VAR_POP進(jìn)行如下計算: (SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1) SAMPLE: VARIANCE 功能描述:該函數返回表達式的變量,Oracle計算該變量如下: 如果表達式中行數為1,則返回0 如果表達式中行數大于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é)方差分析是建立在方差分析和回歸分析基礎之上的一種統計分析方法。 方差分析是從質(zhì)量因子的角度探討因素不同水平對實(shí)驗指標影響的差異。一般說(shuō)來(lái),質(zhì)量因子是可以人為控制的。 回歸分析是從數量因子的角度出發(fā),通過(guò)建立回歸方程來(lái)研究實(shí)驗指標與一個(gè)(或幾個(gè))因子之間的數量關(guān)系。但大多數情況下,數量因子是不可以人為加以控制的。 兩個(gè)不同參數之間的方差就是協(xié)方差 若兩個(gè)隨機變量X和Y相互獨立,則E[(X-E(X))(Y-E(Y))]=0,因而若上述數學(xué)期望不為零,則X和Y必不是相互獨立的,亦即它們之間存在著(zhù)一定的關(guān)系。 定義 E[(X-E(X))(Y-E(Y))]稱(chēng)為隨機變量X和Y的協(xié)方差,記作COV(X,Y),即COV(X,Y)=E[(X-E(X))(Y-E(Y))]。 COVAR_POP 功能描述:返回一對表達式的總體協(xié)方差。 SAMPLE: COVAR_SAMP 功能描述:返回一對表達式的樣本協(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 功能描述:返回一對表達式的相關(guān)系數,它是如下的縮寫(xiě): COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2)) 從統計上講,相關(guān)性是變量之間關(guān)聯(lián)的強度,變量之間的關(guān)聯(lián)意味著(zhù)在某種程度 上一個(gè)變量的值可由其它的值進(jìn)行預測。通過(guò)返回一個(gè)-1~1之間的一個(gè)數,相關(guān) 系數給出了關(guān)聯(lián)的強度,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分析函數——數據分布函數及報表函數 CUME_DIST 功能描述:計算一行在組中的相對位置,CUME_DIST總是返回大于0、小于或等于1的數,該數表示該行在N行中的位置。例如,在一個(gè)3行的組中,返回的累計分布值為1/3、2/3、3/3 SAMPLE:下例中計算每個(gè)部門(mé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è)組分為"表達式"的散列表示,例如,如果表達式=4,則給組中的每一行分配一個(gè)數(從1到4),如果組中有20行,則給前5行分配1,給下5行分配2等等。如果組的基數不能由表達式值平均分開(kāi),則對這些行進(jìn)行分配時(shí),組中就沒(méi)有任何percentile的行數比其它percentile的行數超過(guò)一行,最低的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(累積分配)函數類(lèi)似,對于一個(gè)組中給定的行來(lái)說(shuō),在計算那行的序號時(shí),先減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 功能描述:返回一個(gè)與輸入的分布百分比值相對應的數據值,分布百分比的計算方法見(jiàn)函數CUME_DIST,如果沒(méi)有正好對應的數據值,就取大于該分布值的下一個(gè)值。 注意:本函數與PERCENTILE_CONT的區別在找不到對應的分布值時(shí)返回的替代值的計算方法不同 SAMPLE:下例中0.7的分布值在部門(mén)30中沒(méi)有對應的Cume_Dist值,所以就取下一個(gè)分布值0.83333333所對應的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è)與輸入的分布百分比值相對應的數據值,分布百分比的計算方法見(jiàn)函數PERCENT_RANK,如果沒(méi)有正好對應的數據值,就通過(guò)下面算法來(lái)得到值: 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的區別在找不到對應的分布值時(shí)返回的替代值的計算方法不同 算法太復雜,看不懂了L SAMPLE:在下例中,對于部門(mén)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來(lái)計算 PERCENT_RANK() OVER (PARTITION BY department_id ORDER BY salary) AS pr, --數據分布百分比,從0開(kāi)始計 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:下例計算每個(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 功能描述:這些線(xiàn)性回歸函數適合最小二乘法回歸線(xiàn),有9個(gè)不同的回歸函數可使用。 REGR_SLOPE:返回斜率,等于COVAR_POP(expr1, expr2) / VAR_POP(expr2) REGR_INTERCEPT:返回回歸線(xiàn)的y截距,等于 AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2) REGR_COUNT:返回用于填充回歸線(xiàn)的非空數字對的數目 REGR_R2:返回回歸線(xiàn)的決定系數,計算式為: 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:計算回歸線(xiàn)的自變量(expr2)的平均值,去掉了空對(expr1, expr2)后,等于AVG(expr2) REGR_AVGY:計算回歸線(xiàn)的應變量(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用戶(hù)下完成的) SAMPLE 1:下例計算1998年最后三個(gè)星期中兩種產(chǎn)品(260和270)在周末的銷(xiāo)售量中已開(kāi)發(fā)票數量和總數量的累積斜率和回歸線(xiàn)的截距 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年每月銷(xiāo)售量中已開(kāi)發(fā)票數量和總數量的累積回歸線(xiàn)決定系數 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月最后兩周產(chǎn)品260的銷(xiāo)售量中已開(kāi)發(fā)票數量和總數量的累積平均值 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:下例計算產(chǎn)品260和270在1998年2月周末銷(xiāo)售量中已開(kāi)發(fā)票數量和總數量的累積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; Oracle分析函數——分析函數案例 環(huán)比 環(huán)比就是現在的統計周期和上一個(gè)統計周期比較。例如2008年7月份與2008年6月份相比較稱(chēng)其為環(huán)比。 環(huán)比發(fā)展速度是報告期水平與前一時(shí)期水平之比,表明現象逐期的發(fā)展速度。如計算一年內各月與前一個(gè)月對比,即2月比1月,3月比2月,4月比3月……12月比11月,說(shuō)明逐月的發(fā)展程度。如分析抗擊"非典"期間某些經(jīng)濟現象的發(fā)展趨勢,環(huán)比比同比更說(shuō)明問(wèn)題。 學(xué)過(guò)統計或者經(jīng)濟知識的人都知道,統計指標按其具體內容、實(shí)際作用和表現形式可以分為總量指標、相對指標和平均指標。由于采用基期的不同,發(fā)展速度可分為同比發(fā)展速度、環(huán)比發(fā)展速度和定基發(fā)展速度。簡(jiǎn)單地說(shuō),就是同比、環(huán)比與定基比,都可以用百分數或倍數表示。 定基比發(fā)展速度,也簡(jiǎn)稱(chēng)總速度,一般是指報告期水平與某一固定時(shí)期水平之比,表明這種現象在較長(cháng)時(shí)期內總的發(fā)展速度。同比發(fā)展速度,一般指是指本期發(fā)展水平與上年同期發(fā)展水平對比,而達到的相對發(fā)展速度。環(huán)比發(fā)展速度,一般指是指報告期水平與前一時(shí)期水平之比,表明現象逐期的發(fā)展速度。 同比和環(huán)比,這兩者所反映的雖然都是變化速度,但由于采用基期的不同,其反映的內涵是完全不同的;同比與環(huán)比相比較,而不能拿同比與環(huán)比相比較;而對于同一個(gè)地方,考慮時(shí)間縱向上發(fā)展趨勢的反映,則往往要把同比與環(huán)比放在一起進(jìn)行對照 同比 英文:year-on-year 同比就是今年第n月與去年第n月比;(環(huán)比就是今年第n月與第n-1月或第n+1月比)學(xué)過(guò)統計或者經(jīng)濟知識的人都知道,統計指標按其具體內容、實(shí)際作用和表現形式可以分為總量指標、相對指標和平均指標。由于采用基期的不同,發(fā)展速度可分為同比發(fā)展速度、環(huán)比發(fā)展速度和定基發(fā)展速度。簡(jiǎn)單地說(shuō),就是同比、環(huán)比與定基比,都可以用百分數或倍數表示。 同比發(fā)展速度主要是為了消除季節變動(dòng)的影響,用以說(shuō)明本期發(fā)展水平與去年同期發(fā)展水平對比而達到的相對發(fā)展速度。如,本期2月比去年2月,本期6月比去年6月等。其計算公式為:同比發(fā)展速度=本期發(fā)展水平/去年同期發(fā)展水平×100%。在實(shí)際工作中,經(jīng)常使用這個(gè)指標,如某年、某季、某月與上年同期對比計算的發(fā)展速度,就是同比發(fā)展速度。 環(huán)比發(fā)展速度是報告期水平與前一時(shí)期水平之比,表明現象逐期的發(fā)展速度。如計算一年內各月與前一個(gè)月對比,即2月比1月,3月比2月,4月比3月……12月比11月,說(shuō)明逐月的發(fā)展程度。如分析抗擊"非典"期間某些經(jīng)濟現象的發(fā)展趨勢,環(huán)比比同比更說(shuō)明問(wèn)題。 定基比發(fā)展速度也叫總速度。是報告期水平與某一固定時(shí)期水平之比,表明這種現象在較長(cháng)時(shí)期內總的發(fā)展速度。如,"九五"期間各年水平都以1995年水平為基期進(jìn)行對比,一年內各月水平均以上年12月水平為基期進(jìn)行對比,就是定基發(fā)展速度。 定基比 定基比發(fā)展速度也叫總速度。是報告期水平與某一固定時(shí)期水平之比,表明這種現象在較長(cháng)時(shí)期內總的發(fā)展速度。如,"九五"期間各年水平都以1995年水平為基期進(jìn)行對比,一年內各月水平均以上年12月水平為基期進(jìn)行對比,就是定基發(fā)展速度。 另可參見(jiàn)同比、環(huán)比: 同比發(fā)展速度主要是為了消除季節變動(dòng)的影響,用以說(shuō)明本期發(fā)展水平與去年同期發(fā)展水平對比而達到的相對發(fā)展速度。如,本期2月比去年2月,本期6月比去年6月等。其計算公式為:同比發(fā)展速度=本期發(fā)展水平/去年同期發(fā)展水平×100%。在實(shí)際工作中,經(jīng)常使用這個(gè)指標,如某年、某季、某月與上年同期對比計算的發(fā)展速度,就是同比發(fā)展速度。 環(huán)比發(fā)展速度是報告期水平與前一時(shí)期水平之比,表明現象逐期的發(fā)展速度。如計算一年內各月與前一個(gè)月對比,即2月比1月,3月比2月,4月比3月……12月比11月,說(shuō)明逐月的發(fā)展程度。如分析抗擊"非典"期間某些經(jīng)濟現象的發(fā)展趨勢,環(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 ) --用分析函數替代 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分析函數——CUBE,ROLLUP CUBE 功能描述: 注意: ROLLUP 功能描述: 注意: 如果是ROLLUP(A, B, C)的話(huà),GROUP BY順序 (A、B、C) (A、B) (A) 最后對全表進(jìn)行GROUP BY操作。 如果是GROUP BY CUBE(A, B, C),GROUP BY順序 (A、B、C) (A、B) (A、C) (A), (B、C) (B) (C), 最后對全表進(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); 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ì)合計' WHEN grouping(student_name)=1 AND grouping(subjects)=0 THEN '課目成績(jì)合計' WHEN grouping(student_name)=1 AND grouping(subjects)=1 THEN '總 計' 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í)用例子 使用正規表達式編寫(xiě)更好的SQL 使用正則表達式編寫(xiě)更好的SQL(續) 什么是正規表達式? 正規表達式由一個(gè)或多個(gè)字符型文字和/或元字符組成。在最簡(jiǎn)單的格式下,正規表達式僅由字符文字組成,如正規表達式cat。它被讀作字母c,接著(zhù)是字母a和t,這種模式匹配cat、location和catalog之類(lèi)的字符串。元字符提供算法來(lái)確定Oracle如何處理組成一個(gè)正規表達式的字符。當您了解了各種元字符的含義時(shí),您將體會(huì )到正規表達式用于查找和替換特定的文本數據是非常強大的。 驗證數據、識別重復關(guān)鍵字的出現、檢測不必要的空格,或分析字符串只是正規表達式的許多應用中的一部分。您可以用它們來(lái)驗證電話(huà)號碼、郵政編碼、電子郵件地址、社會(huì )安全號碼、IP地址、文件名和路徑名等的格式。此外,您可以查找如HTML標記、數字、日期之類(lèi)的模式,或任意文本數據中符合任意模式的任何事物,并用其它的模式來(lái)替換它們。 您可以使用最新引進(jìn)的Oracle SQL REGEXP_LIKE操作符和REGEXP_INSTR、REGEXP_SUBSTR以及REGEXP_REPLACE函數來(lái)發(fā)揮正規表達式的作用。您將體會(huì )到這個(gè)新的功能如何對LIKE操作符和INSTR、SUBSTR和REPLACE函數進(jìn)行了補充。實(shí)際上,它們類(lèi)似于已有的操作符,但現在增加了強大的模式匹配功能。被搜索的數據可以是簡(jiǎn)單的字符串或是存儲在數據庫字符列中的大量文本。正規表達式讓您能夠以一種您以前從未想過(guò)的方式來(lái)搜索、替換和驗證數據,并提供高度的靈活性。 正規表達式的基本例子 在使用這個(gè)新功能之前,您需要了解一些元字符的含義。句號(.)匹配一個(gè)正規表達式中的任意字符(除了換行符)。例如,正規表達式a.b匹配的字符串中首先包含字母a,接著(zhù)是其它任意單個(gè)字符(除了換行符),再接著(zhù)是字母b。字符串axb、xaybx和abba都與之匹配,因為在字符串中隱藏了這種模式。如果您想要精確地匹配以a開(kāi)頭和以b結尾的一條三個(gè)字母的字符串,則您必須對正規表達式進(jìn)行定位。脫字符號(^)元字符指示一行的開(kāi)始,而美元符號($)指示一行的結尾(參見(jiàn)表1)。因此,正規表達式^a.b$匹配字符串aab、abb或axb。將這種方式與LIKE²Ù×÷·û提供的類(lèi)似的模式匹配a_b相比較,其中(_)是單字符通配符。 默認情況下,一個(gè)正規表達式中的一個(gè)單獨的字符或字符列表只匹配一次。為了指示在一個(gè)正規表達式中多次出現的一個(gè)字符,您可以使用一個(gè)量詞,它也被稱(chēng)為重復操作符。.如果您想要得到從字母a開(kāi)始并以字母b結束的匹配模式,則您的正規表達式看起來(lái)像這樣:^a.*b$。*元字符重復前面的元字符(.)指示的匹配零次、一次或更多次。LIKE操作符的等價(jià)的模式是a%b,其中用百分號(%)來(lái)指示任意字符出現零次、一次或多次。 表2給出了重復操作符的完整列表。注意它包含了特殊的重復選項,它們實(shí)現了比現有的LIKE通配符更大的靈活性。如果您用圓括號括住一個(gè)表達式,這將有效地創(chuàng )建一個(gè)可以重復一定次數的子表達式。例如,正規表達式b(an)*a匹配ba、bana、banana、yourbananasplit等。 Oracle的正規表達式實(shí)施支持POSIX(可移植操作系統接口)字符類(lèi),參見(jiàn)表3中列出的內容。這意味著(zhù)您要查找的字符類(lèi)型可以非常特別。假設您要編寫(xiě)一條僅查找非字母字符的LIKE條件—作為結果的WHERE子句可能不經(jīng)意就會(huì )變得非常復雜。 POSIX字符類(lèi)必須包含在一個(gè)由方括號([])指示的字符列表中。例如,正規表達式[[:lower:]]匹配一個(gè)小寫(xiě)字母字符,而[[:lower:]]{5}匹配五個(gè)連續的小寫(xiě)字母字符。 除POSIX字符類(lèi)之外,您可以將單獨的字符放在一個(gè)字符列表中。例如,正規表達式^ab[cd]ef$匹配字符串abcef和abdef。必須選擇c或d。 除脫字符(^)和連字符(-)之外,字符列表中的大多數元字符被認為是文字。正規表達式看起來(lái)很復雜,這是因為一些元字符具有隨上下文環(huán)境而定的多重含義。^就是這樣一種元字符。如果您用它作為一個(gè)字符列表的第一個(gè)字符,它代表一個(gè)字符列表的非。因此,[^[:digit:]]查找包含了任意非數字字符的模式,而^[[:digit:]]查找以數字開(kāi)始的匹配模式。連字符(-)指示一個(gè)范圍,正規表達式[a-m]匹配字母a到字母m之間的任意字母。但如果它是一個(gè)字符行中的第一個(gè)字符(如在[-afg]中),則它就代表連字符。 之前的一個(gè)例子介紹了使用圓括號來(lái)創(chuàng )建一個(gè)子表達式;它們允許您通過(guò)輸入更替元字符來(lái)輸入可更替的選項,這些元字符由豎線(xiàn)(|)分開(kāi)。 例如,正規表達式t(a|e|i)n允許字母t和n之間的三種可能的字符更替。匹配模式包括如tan、ten、tin和Pakistan之類(lèi)的字,但不包括teen、mountain或tune。作為另一種選擇,正規表達式t(a|e|i)n也可以表示為一個(gè)字符列表t[aei]n。表4匯總了這些元字符。雖然存在更多的元字符,但這個(gè)簡(jiǎn)明的概述足夠用來(lái)理解這篇文章使用的正規表達式。 REGEXP_LIKE操作符 REGEXP_LIKE操作符向您介紹在Oracle數據庫中使用時(shí)的正規表達式功能。表5列出了REGEXP_LIKE的語(yǔ)法。 下面的SQL查詢(xún)的WHERE子句顯示了REGEXP_LIKE操作符,它在ZIP列中搜索滿(mǎn)足正規表達式[^[:digit:]]的模式。它將檢索ZIPCODE表中的那些ZIP列值包含了任意非數字字符的行。 SELECT zip FROM zipcode WHERE REGEXP_LIKE(zip, '[^[:digit:]]') ZIP ----- ab123 123xy 007ab abcxy 這個(gè)正規表達式的例子僅由元字符組成,更具體來(lái)講是被冒號和方括號分隔的POSIX字符類(lèi)digit。第二組方括號(如[^[:digit:]]中所示)包括了一個(gè)字符類(lèi)列表。如前文所述,需要這樣做是因為您只可以將POSIX字符類(lèi)用于構建一個(gè)字符列表。 REGEXP_INSTR函數 這個(gè)函數返回一個(gè)模式的起始位置,因此它的功能非常類(lèi)似于INSTR函數。新的REGEXP_INSTR函數的語(yǔ)法在表6中給出。這兩個(gè)函數之間的主要區別是,REGEXP_INSTR讓您指定一種模式,而不是一個(gè)特定的搜索字符串;因而它提供了更多的功能。接下來(lái)的示例使用REGEXP_INSTR來(lái)返回字符串Joe Smith, 10045 Berry Lane, San Joseph, CA 91234中的五位郵政編碼模式的起始位置。如果正規表達式被寫(xiě)為[[:digit:]]{5},則您將得到門(mén)牌號的起始位置而不是郵政編碼的,因為10045是第一次出現五個(gè)連續數字。因此,您必須將表達式定位到該行的末尾,正如$元字符所示,該函數將顯示郵政編碼的起始位置,而不管門(mén)牌號的數字個(gè)數。 SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234', '[[:digit:]]{5}$') AS rx_instr FROM dual RX_INSTR ---------- 45 編寫(xiě)更復雜的模式 讓我們在前一個(gè)例子的郵政編碼模式上展開(kāi),以便包含一個(gè)可選的四位數字模式。您的模式現在可能看起來(lái)像這樣:[[:digit:]]{5}(-[[:digit:]]{4})?$。如果您的源字符串以5位郵政編碼或5位+ 4位郵政編碼的格式結束,則您將能夠顯示該模式的起始位置。 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è)示例中,括弧里的子表達式(-[[:digit:]]{4})將按?重復操作符的指示重復零次或一次。此外,企圖用傳統的SQL函數來(lái)實(shí)現相同的結果甚至對SQL專(zhuān)家也是一個(gè)挑戰。為了更好地說(shuō)明這個(gè)正規表達式示例的不同組成部分,表7包含了一個(gè)對單個(gè)文字和元字符的描述。 REGEXP_SUBSTR函數 SUBSTR函數的REGEXP_SUBSTR函數用來(lái)提取一個(gè)字符串的一部分。表8顯示了這個(gè)新函數的語(yǔ)法。在下面的示例中,匹配模式[^,]*的字符串將被返回。該正規表達式搜索其后緊跟著(zhù)空格的一個(gè)逗號;然后按[^,]*的指示搜索零個(gè)或更多個(gè)不是逗號的字符,最后查找另一個(gè)逗號。這種模式看起來(lái)有點(diǎn)像一個(gè)用逗號分隔的值字符串。 SELECT REGEXP_SUBSTR('first field, second field , third field', ', [^,]*,') FROM dual REGEXP_SUBSTR('FIR ------------------ , second field , REGEXP_REPLACE函數 讓我們首先看一下傳統的REPLACE SQL函數,它把一個(gè)字符串用另一個(gè)字符串來(lái)替換。假設您的數據在正文中有不必要的空格,您希望用單個(gè)空格來(lái)替換它們。利用REPLACE函數,您需要準確地列出您要替換多少個(gè)空格。然而,多余空格的數目在正文的各處可能不是相同的。下面的示例在Joe和Smith之間有三個(gè)空格。REPLACE函數的參數指定要用一個(gè)空格來(lái)替換兩個(gè)空格。在這種情況下,結果在原來(lái)的字符串的Joe和Smith之間留下了一個(gè)額外的空格。 SELECT REPLACE('Joe Smith',' ', ' ') AS replace FROM dual REPLACE --------- Joe Smith REGEXP_REPLACE函數把替換功能向前推進(jìn)了一步,其語(yǔ)法在表9中列出。以下查詢(xún)用單個(gè)空格替換了任意兩個(gè)或更多的空格。( )子表達式包含了單個(gè)空格,它可以按{2,}的指示重復兩次或更多次。 SELECT REGEXP_REPLACE('Joe Smith', '( ){2,}', ' ') AS RX_REPLACE FROM dual RX_REPLACE ---------- Joe Smith '^'匹配輸入字符串的開(kāi)始位置,在方括號表達式中使用,此時(shí)它表示不接受該字符集合。 '$'匹配輸入字符串的結尾位置。如果設置了RegExp對象的Multiline屬性,則$也匹配'n'或'r'。 '.'匹配除換行符n之外的任何單字符。 '?'匹配前面的子表達式零次或一次。 '*'匹配前面的子表達式零次或多次。 '+'匹配前面的子表達式一次或多次。 '( )'標記一個(gè)子表達式的開(kāi)始和結束位置。 '[]'標記一個(gè)中括號表達式。 '{m,n}'一個(gè)精確地出現次數范圍,m=<出現次數<=n,'{m}'表示出現m次,'{m,}'表示至少出現m次。 '|'指明兩項之間的一個(gè)選擇。例子'^([a-z]+|[0-9]+)$'表示所有小寫(xiě)字母或數字組合成的字符串。 num匹配num,其中num是一個(gè)正整數。對所獲取的匹配的引用。 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:]]') --任何含有非數字的字符列表 union select 3,'^[[:digit:]]',mc from test where regexp_like(mc,'^[[:digit:]]') --數字開(kāi)頭 union select 4,'^[^[:digit:]]',mc from test where regexp_like(mc,'^[^[:digit:]]') --包含任何非數字開(kāi)頭的 union select 5,'[[:digit:]]',mc from test where regexp_like(mc,'[[:digit:]]') --任何含有數字的字符列表 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)于正則表達式的后向引用,暫時(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ě)結合的字符串 -- 'x', 'X' -返回全是大寫(xiě)和數字的字符串 -- 'p', 'P' -返回鍵盤(pán)上出現字符的隨機組合 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 )







