关键词不能为空

当前您在: 主页 > 英语 >

oracle用法集锦

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2021-02-08 16:42
tags:

-

2021年2月8日发(作者:waist)


一﹑


Oracle ROLLUP



CUBE


用法



Oracle



GROUP BY


语句除了最基本的语法外



还支持


ROLLUP



CUBE


语句



如果是


ROLLUP(A, B, C)


的话



首先会对

< p>
(A



B



C)


进行


GROUP BY



然后对


(A



B)


进行


GROUP BY


,然后是


(A)


进行


GROUP BY


,最后对全表进行


GROUP BY


操作



如果是


GROUP BY CUBE(A, B, C)



则首先会对

(A



B



C)


进行


GROUP BY



然后依次是


(A



B )



(A



C )



(A)



(B



C)



(B)



(C)


,最后对全表进行


GROUP


BY


操作。



grouping_id()


可以美化效果:



Oracle



GROUP BY


语句除了最基本的语法外,还支持


ROLLUP


CUBE


语句。



SQL> create table t as select * from dba_indexes;





表已创建。




SQL> select index_type, status, count(*) from t group by index_type, status;




INDEX_TYPE STATUS COUNT(*)


--------------------------- -------- ----------


LOB VALID 51


NORMAL N/A 25


NORMAL VALID 479


CLUSTER VALID 11




下面来看看


ROLLUP

< p>


CUBE


语句的执行结果。



SQL> select index_type, status, count(*) from t group by rollup(index_type, status);




INDEX_TYPE STATUS COUNT(*)


--------------------------- -------- ----------


LOB VALID 51


LOB 51


NORMAL N/A 25


NORMAL VALID 479


NORMAL 504


CLUSTER VALID 11


CLUSTER 11


566




已选择


8


行。




SQL> select index_type, status, count(*) from t group by cube(index_type, status);




INDEX_TYPE STATUS COUNT(*)


--------------------------- -------- ----------


566


N/A 25


VALID 541


LOB 51


LOB VALID 51


NORMAL 504


NORMAL N/A 25


NORMAL VALID 479


CLUSTER 11


CLUSTER VALID 11




已选择


10


行。




查询结果不是很一目了然,下面通过


Oracle


提供的函数


GROUPING


来整理一下查询结果。




SQL> select grouping(index_type) g_ind, grouping(status) g_st, index_type, status,


count(*)


2 from t group by rollup(index_type, status) order by 1, 2;




G_IND G_ST INDEX_TYPE STATUS COUNT(*)


---------- ---------- --------------------------- -------- ----------


0 0 LOB VALID 51


0 0 NORMAL N/A 25


0 0 NORMAL VALID 479


0 0 CLUSTER VALID 11


0 1 LOB 51


0 1 NORMAL 504


0 1 CLUSTER 11


1 1 566




已选择


8


行。




这个查询结果就直观多了,和不带


R OLLUP


语句的


GROUP


BY< /p>


相比,


ROLLUP


增加了对

< p>
INDEX_TYPE



GROUP BY


统计和对所有记录的


GROUP BY


统计。




也就是说,如果是


ROLLUP(A, B, C)

< p>
的话,首先会对


(A



B



C)


进行


G ROUP BY


,然后对


(A



B)


进行


GROUP BY

< br>,然后是


(A)


进行


GROUP BY


,最后对全表进行


GROUP BY


操作。




下面看看


CUBE


语句。




SQL> select grouping(index_type) g_ind, grouping(status) g_st, index_type, status,


count(*)


2 from t group by cube(index_type, status) order by 1, 2;




G_IND G_ST INDEX_TYPE STATUS COUNT(*)


---------- ---------- --------------------------- -------- ----------


0 0 LOB VALID 51


0 0 NORMAL N/A 25


0 0 NORMAL VALID 479


0 0 CLUSTER VALID 11


0 1 LOB 51


0 1 NORMAL 504


0 1 CLUSTER 11


1 0 N/A 25


1 0 VALID 541


1 1 566




已选择


10


行。





R OLLUP


相比,


CUBE


又增加了对


STATUS


列的


GROUP BY


统计。




如果是


GROUP BY CUBE(A, B, C)


,则首先会对


(A



B



C)


进行


GROUP BY


,然后依次是


(A



B)



(A



C)



(A)



(B



C)



(B)



(C)

,最后对全表进行


GROUP BY


操作。




除了使用


GROUPING


函数,还可以使用


GROUPING_ID


来标识


GROUP BY


结果。




SQL> select grouping_id(index_type, status) g_ind, index


_type, status, count(*)


2 from t group by rollup(index_type, status) order by 1;




G_IND INDEX_TYPE STATUS COUNT(*)


---------- --------------------------- -------- ----------


0 LOB VALID 51


0 NORMAL N/A 25


0 NORMAL VALID 479


0 CLUSTER VALID 11


1 LOB 51


1 NORMAL 504


1 CLUSTER 11


3 566




已选择


8


行。




SQL> select grouping_id(index_type, status) g_ind, index_type, status, count(*)


2 from t group by cube(index_type, status) order by 1;




G_IND INDEX_TYPE STATUS COUNT(*)


---------- --------------------------- -------- ----------


0 LOB VALID 51


0 NORMAL N/A 25


0 NORMAL VALID 479


0 CLUSTER VALID 11


1 LOB 51


1 NORMAL 504


1 CLUSTER 11


2 N/A 25


2 VALID 541


3 566




已选择

10


行。



grouping_i d()


可以美化效果:



select DECODE(GROUPING_ID(C1), 1, '


合计


', C1) D1,


DECODE(GROUPING_ID(C1, C2), 1, '


小计


', C2) D2,


DECODE(GROUPING_ID(C1, C2, C1 + C2), 1, '


小计


', C1 + C2) D3,


count(*),


GROUPING_ID(C1, C2, C1 + C2, C1 + 1, C2 + 1),


GROUPING_ID(C1)


from T2


group by rollup(C1, C2, C1 + C2, C1 + 1, C2 + 1);



================ ===========================================



1.


报表合计专用的


Rol lup


函数



销售报表



广州



1




2000




广州



2




2500




广州



4500




深圳



1




1000




深圳



2




2000




深圳



3000




所有地区



7500





以往的查询


SQL:



Select area,month,sum(money) from SaleOrder group by area,month



然后广州,深圳的合计和所有地区合计都需要在程序里自行累计




1.


其实可以使用如下

< p>
SQL:



Select area,month,sum(total_sale) from SaleOrder group by rollup(area,month)



就能产生和报表一模一样的纪录




2.


如果


year

不想累加,可以写成



Select year,month,area,sum(total_sale) from SaleOrder group by year, rollup(month,area)



另外


Oracle 9i


还支持如下语法


:



Select year,month,area,sum(total_sale) from SaleOrder group by rollup((year,month),area)




3.


如果使用


Cube(area,m onth)


而不是


RollUp(area,month)


,除了获得每个地区的合计之外,还


将获得每个月份的合计,在报表 最后显示。




ng


让合计列更好读



RollUp


在显示广州合计时,月份列为


NULL< /p>


,但更好的做法应该是显示为



所有月份< /p>




Grouping

就是用来判断当前


Column


是否是一个合计列,


1



yes


,然后用


Decode


把它转为



所有月份




Select D ecode(Grouping(area),1,'


所有地区


',area) area, Decode(Grouping(month),1,'


所有月份


',month), sum(money) From SaleOrder Group by RollUp(area,month);




2.


对多级层次查询的


start with.....connect by



比如人员组织


,


产品类别


,Oracle


提供了很经典的方法



SELECT LEVEL, name, emp_id,manager_emp_id FROM employee START W


ITH


manager_emp_id is null CONNECT BY PRIOR emp


_id = manager_emp_id;



上面的语句


demo


了全部的应用


,start with


指明从哪里开始遍历树


,


如果从根开始


,


那么它的


manager

< br>应该是


Null,


如果从某个职员开始

< br>,


可以写成


emp_id='11'


CONNECT BY


就是指明父子关系


,


注意


PRIOR


位置



另外还有一个


LEVEL



,


显示节点的层次




3.


更多报表

/


分析决策功能



3.1


分析功能的基本结构



分析功能


() over( partion


子句


,order by


子句


,


窗口子句


)

< br>


概念上很难讲清楚


,


还是用例 子说话比较好


.




3.2 Row_Number




Rank, DENSE_Rank



用于选出


Top 3 sales


这样的报表



当两个业务员 可能有相同业绩时


,


就要使用


Rank



Dense_Rank



比如



金额



RowNum Rank Dense_Rank



张三



4000




1 1 1



李四



3000




2 2 2



钱五



2000




3 3 3



孙六



2000




4 3 3



丁七



1000




5 5 4



这时

,


应该把并列第三的钱五和孙六都选进去


,


所以用


Ranking


功能比


RowNumber


保险


.


至于


Desnse


还是


Ranking

< p>
就看具体情况了。



SELECT salesperson_id, SUM(tot_sales) sp_sales, RANK( ) OVER (ORDER BY


SUM(tot_sales) DESC) sales_rank FROM orders GROUP BY salesperson_id



3.3 NTILE


把纪录平分成甲乙丙丁四等




比如我想取得前


25%


的纪录


,


或者把


25%


的纪录当作同 一个


level


平等对待


,

< p>
把另


25%


当作另一个


L evel


平等对待



SELECT cust_nbr, SUM(tot_sales) cust_sales, NTILE(4) OVER (ORDER BY SUM(tot_sales)


DESC) sales_quartile FROM orders GROUP BY cust_nbr ORDER BY 3,2 DESC;



NTITLE(4)


把纪录以



SUM(tot_sales)


排序分成


4< /p>



.




3.4


辅助分析列和


Windows Function



报表除了基本事实数据外

< br>,


总希望旁边多些全年总销量


,


到目前为止的累计销量


,


前后三个月的平


均销量这样的列来参考


.



这种前后 三个月的平均和到目前为止的累计销量就叫


windows function,


见下例



SELECT month, SUM(tot_sales) monthly_sales, SUM(SUM(tot_sales)) OVER (ORDER BY


month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)


max_preceeding FROM orders GROUP BY month ORDER BY month;



SELECT month, SUM(tot_sales) monthly_sales, AVG(SUM(tot_sales)) OVER (ORDER BY


month ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) rolling_avg FROM orders


GROUP BY month ORDER BY month;



Windows Function

< p>
的关键就是


Windows


子句的几个取值



1 PRECEDING


之前的一条记录



1 FOLLOWING


之后的一条记录



UNBOUNDED PRECEDING


之前的所有记录



CURRENT ROW


当前纪录




ry


总结



S ubQuery


天天用了


,


理论上总结 一下


.SubQuery


分三种



related


子查询



最普通的样式


.



ated Subqueries


把父查询的列拉到子查询里 面去


,


头一回


cyt

< br>教我的时候理解了半天


.



View


也被当成最普通的样式用了


.




然后


Noncorrelated


子查询又有三种情况



1.


返回一行一列



where price < (select max(price) from goods )



2.


返回多行一列



where price>= ALL (select price from goods where type=2)



or where NOT price< ANY(select price from goods where type=2)



最常用的


IN


其实就是


=ANY()



3.


返回多行多列



一次返回多列当然就节省了查询时间




UPDATE monthly_orders SET (tot_orders, max_order_amt) = (SELECT COUNT(*),


MAX


(sale_price) FROM cust_order) DELETE FROM line_item WHERE (order_nbr, part_nbr)


IN (SELECT order_nbr, part_nbr FROM cust_order c)



======================================= =


/*--------


理解


gro uping sets



select a, b, c, sum( d ) from t


group by grouping sets ( a, b, c )



等效于



select * from (


select a, null, null, sum( d ) from t group by a


union all


select null, b, null, sum( d ) from t group by b



union all


select null, null, c, sum( d ) from t group by c



)


*/



二﹑



开窗函数的的理解:



开窗函数指定了 分析函数工作的数据窗口大小,


这个数据窗口大小可能会随着行的变化而变化,


举例如下:



over



order by salary




按照


salary


排序进行累计,


order by


是个默认的开窗函数



over



partition by deptno


)按照部门分区



over



order by salary range between 50 preceding and 150 following




每行对应的数 据窗口是之前行幅度值不超过


50


,之后行幅度值不超过


150


over



order by salary rows between 50 preceding and 150 following




每行对应的数 据窗口是之前


50


行,之后


150




over



order by salary rows between unbounded preceding and unbounded following




每行对应的数据窗口是从第一行到最后一行,等效:



over



order by salary range between unbounded preceding and unbounded following




主要参考资料:《


expert one-on- one




Tom Kyte



Oracle9i SQL Reference

< p>
》第


6





AVG



功能描述:用于计算一个组和数据窗口内表达式的帄均值。


< /p>


SAMPLE


:下面的例子中列


c_ma vg


计算员工表中每个员工的帄均薪水报告,该帄均值由当前员


工和与之具有相同经理的前一个和后一个三者的帄均数得来;



SELECT manager_id, last_name, hire_date, salary,


AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date



ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg


FROM employees;



MANAGER_ID LAST_NAME HIRE_DATE SALARY C_MAVG



---------- ------------------------- --------- ---------- ----------


100 Kochhar 21-SEP-89 17000 17000


100 De Haan 13-JAN-93 17000 15000


100 Raphaely 07-DEC-94 11000 11966.6667


100 Kaufling 01-MAY-95 7900 10633.3333


100 Hartstein 17-FEB-96 13000 9633.33333


100 Weiss 18-JUL-96 8000 11666.6667


100 Russell 01-OCT-96 14000 11833.3333



CORR



功能描述:返回一对表达式的相关系数,它是如下的缩写:


< /p>


COVAR_POP(expr1,expr2)/STDDEV_POP(expr1) *STDDEV_POP(expr2))



从统计上讲,相关 性是变量之间关联的强度,变量之间的关联意味着在某种程度



上一个变量的值可由其它的值进行预测。通过返回一个


-1~1


之间的一个数


,


相关



系数给出了关联的强度,


0


表示不相关。

< p>


SAMPLE



下例返 回


1998


年月销售收入和月单位销售的关系的累积系数


(本例在


SH


用户下运行)

< br>


SELECT ar_month_number,


CORR (SUM(_sold), SUM(ty_sold))


OVER (ORDER BY ar_month_number) as CUM_CORR


FROM sales s, times t


WHERE _id = _id AND calendar_year = 1998


GROUP BY ar_month_number


ORDER BY ar_month_number;



CALENDAR_MONTH_NUMBER CUM_CORR


--------------------- ----------


1


2 1


3 .994309382


4 .852040875


5 .846652204


6 .871250628


7 .910029803


8 .917556399


9 .920154356


10 .86720251


11 .844864765


12 .903542662




COVAR_POP



功能描述:返回一对表达式的总体协方差。


< br>SAMPLE


:下例


CUM_COVP

< br>返回定价和最小产品价格的累积总体协方差



SELECT product_id, supplier_id,


COVAR_POP(list_price, min_price)



OVER (ORDER BY product_id, supplier_id) AS CUM_COVP,



COVAR_SAMP(list_price, min_price)


OVER (ORDER BY product_id, supplier_id) AS CUM_COVS



FROM product_information p


WHERE category_id = 29


ORDER BY product_id, supplier_id;



PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS



---------- ----------- ---------- ----------


1774 103088 0


1775 103087 1473.25 2946.5


1794 103096 1702.77778 2554.16667


1825 103093 1926.25 2568.33333


2004 103086 1591.4 1989.25


2005 103086 1512.5 1815


2416 103088 1475.97959 1721.97619


.


.




COVAR_SAMP



功能描述:返回一对表达式的样本协方差


SAMPLE


:下例


CUM_COVS

返回定价和最小产品价格的累积样本协方差



SELECT product_id, supplier_id,


COVAR_POP(list_price, min_price)



OVER (ORDER BY product_id, supplier_id) AS CUM_COVP,



COVAR_SAMP(list_price, min_price)


OVER (ORDER BY product_id, supplier_id) AS CUM_COVS



FROM product_information p


WHERE category_id = 29


ORDER BY product_id, supplier_id;



PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS



---------- ----------- ---------- ----------


1774 103088 0


1775 103087 1473.25 2946.5


1794 103096 1702.77778 2554.16667


1825 103093 1926.25 2568.33333


2004 103086 1591.4 1989.25


2005 103086 1512.5 1815


2416 103088 1475.97959 1721.97619


.


.




COUNT





能描述:对一组内发生的事情进行 累积计数,如果指定


*


或一些非空常数,


count


将对所有行


计数,如果指定一个表达式,


count


返回表达式非空赋值的计



数,当有相同值出现时,这些相等


的值都会被纳入被计算的值;


可以使用


DISTINCT


来记录去掉一组中完 全相同的数据后出现的行


数。



SAM PLE


:下面例子中计算每个员工在按薪水排序中当前行附近薪水在

[n-50,n+150]


之间的行数,


n


表示当前行的薪水



例如,


P hiltanker


的薪水


2200


, 排在他之前的行中薪水大于等于


2200-50


的有

< p>
1


行,排在他之后的


行中薪水小于等于

< p>
2200



150


的行没 有,所以


count


计数值


cnt3< /p>



2


(包括自己当前行);


cnt2


值相当于小于等于当前行的


SALARY< /p>


值的所有行数



SELECT last_name, salary, COUNT(*) OVER () AS cnt1,



COUNT(*) OVER (ORDER BY salary) AS cnt2,


COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING



AND 150 FOLLOWING) AS cnt3 FROM employees;



LAST_NAME SALARY CNT1 CNT2 CNT3


------------------------- ---------- ---------- ---------- ----------


Olson 2100 107 1 3


Markle 2200 107 3 2


Philtanker 2200 107 3 2


Landry 2400 107 5 8


Gee 2400 107 5 8


Colmenares 2500 107 11 10


Patel 2500 107 11 10


.


.




CUME_DIST



功能描述:计 算一行在组中的相对位置,


CUME_DIST


总是返回大于< /p>


0


、小于或等于


1


的数,该


数表示该行在


N


行中的位置 。例如,在一个


3


行的组中,返回的累计分布值为


1/3



2/3



3/3


SAMPLE


:下例中计算每个工种的 员工按薪水排序依次累积出现的分布百分比



SELECT job_id, last_name, salary, CUME_DIST()



OVER (PARTITION BY job_id ORDER BY salary) AS cume_dist


FROM employees WHERE job_id LIKE 'PU%';



JOB_ID LAST_NAME SALARY CUME_DIST


---------- ------------------------- ---------- ----------


PU_CLERK Colmenares 2500 .2


PU_CLERK Himuro 2600 .4


PU_CLERK Tobias 2800 .6


PU_CLERK Baida 2900 .8


PU_CLERK Khoo 3100 1


PU_MAN Raphaely 11000 1




DENSE_RANK





能描述:根据


ORDER BY


子句中 表达式的值,从查询返回的每一行,计算它们与其它行的相


对位置。组内的数据按


ORDER BY


子句排序,然后给每一行赋一个号,从而形成一个序 列,该


序列从


1


开始,往后累加。每次


ORDER BY


表达式的值发生变化时,该序列也随之增加。 有同


样值的行得到同样的数字序号(认为


null


时相等的)。密集的序列返回的时没有间隔的数



S AMPLE


:下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与


RANK



数的区别)



SELECT ment_id , _name, , DENSE_RANK()



OVER (PARTITION BY ment_id ORDER BY ) as drank



FROM employees e, departments d


WHERE ment_id = ment_id


AND ment_id IN ('60', '90');



DEPARTMENT_ID LAST_NAME SALARY DRANK



------------- ------------------------- ---------- ----------


60 Lorentz 4200 1


60 Austin 4800 2


60 Pataballa 4800 2


60 Ernst 6000 3


60 Hunold 9000 4


90 Kochhar 17000 1


90 De Haan 17000 1


90 King 24000 2




FIRST



功能描述:从


DENSE_RANK


返回的集合中取出排在最前面的一个值的行(可能多行,因为值可


能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录



SAMPLE



下面例子中


DENSE_RANK


按部门分区,再按佣金< /p>


commission_pct


排序,


F IRST


取出


佣金最低的对应的所有行,然后前面的

< p>
MAX


函数从



这个集合 中取出薪水最低的值;


LAST


取出


佣 金最高的对应的所有行,然后前面的


MIN


函数从这个集合中取 出薪水最高的值



SELECT last_name, department_id, salary,


MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)



OVER (PARTITION BY department_id)


MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)



OVER (PARTITION BY department_id)



FROM employees



WHERE department_id in (20,80)



ORDER BY department_id, salary;



LAST_NAME DEPARTMENT_ID SALARY Worst Best


------------------------- ------------- ---------- ---------- ----------


Fay 20 6000 6000 13000


Hartstein 20 13000 6000 13000


Kumar 80 6100 6100 14000


Banda 80 6200 6100 14000


Johnson 80 6200 6100 14000


Ande 80 6400 6100 14000


Lee 80 6800 6100 14000


Tuvault 80 7000 6100 14000


Sewall 80 7000 6100 14000


Marvins 80 7200 6100 14000


Bates 80 7300 6100 14000


.


.


.




FIRST_VALUE



功能描述:返回组中数据窗口的第一个值。


< br>SAMPLE


:下面例子计算按部门分区按薪水排序的数据窗口的第一个值对应的 名字,如果薪水的


第一个值有多个,则从多个对应的名字中取缺省排序的第一个名字



SELECT department_id, last_name, salary, FIRST_VALUE(last_name)



OVER (PARTITION BY department_id ORDER BY salary ASC ) AS lowest_sal


FROM employees



WHERE department_id in(20,30);



DEPARTMENT_ID LAST_NAME SALARY LOWEST_SAL


------------- ------------------------- ---------- --------------


20 Fay 6000 Fay


20 Hartstein 13000 Fay


30 Colmenares 2500 Colmenares


30 Himuro 2600 Colmenares


30 Tobias 2800 Colmenares


30 Baida 2900 Colmenares


30 Khoo 3100 Colmenares


30 Raphaely 11000 Colmenares




LAG





能描述:可以访问结果集中的其它 行而不用进行自连接。它允许去处理游标,就好像游标是


一个数组一样。在给定组中可参 考当前行之前的行,这样就可以从组中与



当前行一起选择以前


的行。


Offset


是一个正整数,其 默认值为


1


,若索引超出窗口的范围,就返回默认值(默认返回


的是组中第一行),其相反的函数是



LEAD


SAMPLE


:下面的例子 中列


prev_sal


返回按


hire _date


排序的前


1


行的

< p>
salary




SELECT last_name, hire_date, salary,


LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_sal


FROM employees


WHERE job_id = 'PU_CLERK';



LAST_NAME HIRE_DATE SALARY PREV_SAL


------------------------- ---------- ---------- ----------


Khoo 18-5




-95 3100 0


Tobias 24-7




-97 2800 3100


Baida 24-12



-97 2900 2800


Himuro 15-11



-98 2600 2900


Colmenares 10-8




-99 2500 2600




LAST



功能描述:从


DENSE_RANK


返回的集合中取出排在最后面的一个值的行(可能多行,因为值可


能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录



SAMPLE



下面例子中


DENSE_RANK


按部门分区,再按佣金< /p>


commission_pct


排序,


F IRST


取出


佣金最低的对应的所有行,然后前面的

< p>
MAX


函数从



这个集合 中取出薪水最低的值;


LAST


取出


佣 金最高的对应的所有行,然后前面的


MIN


函数从这个集合中取 出薪水最高的值



SELECT last_name, department_id, salary,


MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)



OVER (PARTITION BY department_id)


MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)



OVER (PARTITION BY department_id)


FROM employees



WHERE department_id in (20,80)



ORDER BY department_id, salary;



LAST_NAME DEPARTMENT_ID SALARY Worst Best


------------------------- ------------- ---------- ---------- ----------


Fay 20 6000 6000 13000


Hartstein 20 13000 6000 13000


Kumar 80 6100 6100 14000


Banda 80 6200 6100 14000


Johnson 80 6200 6100 14000


Ande 80 6400 6100 14000


Lee 80 6800 6100 14000


Tuvault 80 7000 6100 14000


Sewall 80 7000 6100 14000


Marvins 80 7200 6100 14000


Bates 80 7300 6100 14000


.


LAST_VALUE



功能描述:返回组中数据窗口的最后一个值。



SAMPLE


:下面例子计算按部门分区按薪水排序的数据窗口的最后一个值对 应的名字,如果薪水


的最后一个值有多个,则从多个对应的名字中取缺省排序的最后一个 名字



SELECT department_id, last_name, salary, LAST_VALUE(last_name)



OVER(PARTITION BY department_id ORDER BY salary) AS highest_sal


FROM employees



WHERE department_id in(20,30);



DEPARTMENT_ID LAST_NAME SALARY HIGHEST_SAL


------------- ------------------------- ---------- ------------


20 Fay 6000 Fay


20 Hartstein 13000 Hartstein


30 Colmenares 2500 Colmenares


30 Himuro 2600 Himuro


30 Tobias 2800 Tobias


30 Baida 2900 Baida


30 Khoo 3100 Khoo


30 Raphaely 11000 Raphaely




LEAD



功能描述:


LEAD



LAG


相反,


LEAD


可以访问组中当前行之后的行 。


Offset


是一个正整数,其


默认 值为


1


,若索引超出窗口的范围,就返回默认值(默认返回的是 组中第一行)



SAMPLE


:下面的 例子中每行的



返回按


hire_dat e


排序的下一行的


hire_date




SELECT last_name, hire_date,



LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS



FROM employees WHERE department_id = 30;



LAST_NAME HIRE_DATE NextHired


------------------------- --------- ---------


Raphaely 07-DEC-94 18-MAY-95


Khoo 18-MAY-95 24-JUL-97


Tobias 24-JUL-97 24-DEC-97


Baida 24-DEC-97 15-NOV-98


Himuro 15-NOV-98 10-AUG-99


Colmenares 10-AUG-99




MAX



功能描述:在一个组中的数据窗口中查找表达式的最大值。


< /p>


SAMPLE


:下面例子中


dept_m ax


返回当前行所在部门的最大薪水值



SELECT department_id, last_name, salary,



MAX(salary) OVER (PARTITION BY department_id) AS dept_max



FROM employees WHERE department_id in (10,20,30);



DEPARTMENT_ID LAST_NAME SALARY DEPT_MAX



------------- ------------------------- ---------- ----------


10 Whalen 4400 4400


20 Hartstein 13000 13000


20 Fay 6000 13000


30 Raphaely 11000 11000


30 Khoo 3100 11000


30 Baida 2900 11000


30 Tobias 2800 11000


30 Himuro 2600 11000


30 Colmenares 2500 11000




MIN



功能描述:在一个组中的数据窗口中查找表达式的最小值。


< /p>


SAMPLE


:下面例子中


dept_m in


返回当前行所在部门的最小薪水值



SELECT department_id, last_name, salary,



MIN(salary) OVER (PARTITION BY department_id) AS dept_min



FROM employees WHERE department_id in (10,20,30);



DEPARTMENT_ID LAST_NAME SALARY DEPT_MIN



------------- ------------------------- ---------- ----------


10 Whalen 4400 4400


20 Hartstein 13000 6000


20 Fay 6000 6000


30 Raphaely 11000 2500


30 Khoo 3100 2500


30 Baida 2900 2500


30 Tobias 2800 2500


30 Himuro 2600 2500


30 Colmenares 2500 2500




NTILE





能描述 :将一个组分为



表达式



的散列表示,例如,如果表达式


=4


,则给组中的每一 行分配


一个数(从


1



4


),如果组中有


20


行,则 给前


5


行分配


1


,给下



5


行分配

< br>2


等等。如果组的基


数不能由表达式值帄均分开,则对这 些行进行分配时,组中就没有任何


percentile


的行数 比其它


percentile


的行


< /p>


数超过一行,


最低的


percentil e


是那些拥有额外行的


percentile

< br>。


例如,


若表达式


=4



行数


=21


,则


percentile=1


的有


5


行,


percentile=2


的有


5


行等等。



SAMP LE


:下例中把


6


行数据分为


4




SELECT last_name, salary,



NTILE(4) OVER (ORDER BY salary DESC) AS quartile FROM employees



WHERE department_id = 100;



LAST_NAME SALARY QUARTILE


------------------------- ---------- ----------


Greenberg 12000 1


Faviet 9000 1


Chen 8200 2


Urman 7800 2


Sciarra 7700 3


Popp 6900 4




PERCENT_RANK



功能描 述:和


CUME_DIST


(累积分配)函数类似,对于一个组 中给定的行来说,在计算那行的


序号时,先减


1


,然后除以


n-1



n


为组中所有的行数)。该函数总是返回


0


~< /p>


1


(包括


1


)之 间的


数。



SAMPLE


:下例中如果


Khoo



s alary



2900


,则

< p>
pr


值为


0.6


,因为< /p>


RANK


函数对于等值的返回


序列值是一 样的



SELECT department_id, last_name, salary,



PERCENT_RANK()



OVER (PARTITION BY department_id ORDER BY salary) AS pr



FROM employees


WHERE department_id < 50


ORDER BY department_id,salary;



DEPARTMENT_ID LAST_NAME SALARY PR


------------- ------------------------- ---------- ----------


10 Whalen 4400 0


20 Fay 6000 0


20 Hartstein 13000 1


30 Colmenares 2500 0


30 Himuro 2600 0.2


30 Tobias 2800 0.4


30 Baida 2900 0.6


30 Khoo 3100 0.8


30 Raphaely 11000 1


40 Mavris 6500 0




PERCENTILE_CONT



功能描述:返回一个与输入的分布百分比值相对应的数据值,分布百分比的计算方法见函 数


PERCENT_RANK


,如果没有正好对应的数据值,就 通过下面算法来得到值:



RN = 1+ (P*(N-1))


其中


P


是输入的 分布百分比值,


N


是组内的行数



CRN = CEIL(RN) FRN = FLOOR(RN)


if (CRN = FRN = RN) then



(value of expression from row at RN)


else


(CRN - RN) * (value of expression for row at FRN) +


(RN - FRN) * (value of expression for row at CRN)


注意:本函数与


PERCENTILE_DISC


的区别在找不 到对应的分布值时返回的替代值的计算方法不




SAMPLE


:在下例中,对于部门


60

< p>


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 last_name, salary, department_id,


PERCENTILE_CONT(0.7) WITHIN GROUP (ORDER BY salary)



OVER (PARTITION BY department_id)



PERCENT_RANK()



OVER (PARTITION BY department_id ORDER BY salary)



FROM employees WHERE department_id IN (30, 60);



LAST_NAME SALARY DEPARTMENT_ID Percentile_Cont Percent_Rank



------------------------- ---------- ------------- --------------- ------------


Colmenares 2500 30 3000 0


Himuro 2600 30 3000 0.2


Tobias 2800 30 3000 0.4


Baida 2900 30 3000 0.6


Khoo 3100 30 3000 0.8


Raphaely 11000 30 3000 1


Lorentz 4200 60 5760 0


Austin 4800 60 5760 0.25


Pataballa 4800 60 5760 0.25


Ernst 6000 60 5760 0.75


Hunold 9000 60 5760 1




PERCENTILE_DISC



功能描述:返回一个与输入的分布百分比值相对应的数据值,分布百分比的计算方法见函 数


CUME_DIST


,如果没有正好对应的数据值,就取大于 该分布值的下一个值。



注意:本函数与


PERCENTILE_CONT


的区别在找不到对应的分布值时返回的替代值的计算 方法


不同



SAMPLE


:下例中


0.7


的分布值在部门

30


中没有对应的


Cume_Dist

值,所以就取下一个分布值


0.83333333


所对应的


SALARY


来替代



SELECT last_name, salary, department_id,


PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY salary )



OVER (PARTITION BY department_id)


CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary)



FROM employees



WHERE department_id in (30, 60);



LAST_NAME SALARY DEPARTMENT_ID Percentile_Disc Cume_Dist


------------------------- ---------- ------------- --------------- ----------


Colmenares 2500 30 3100 .166666667


Himuro 2600 30 3100 .333333333


Tobias 2800 30 3100 .5


Baida 2900 30 3100 .666666667


Khoo 3100 30 3100 .833333333


Raphaely 11000 30 3100 1


Lorentz 4200 60 6000 .2


Austin 4800 60 6000 .6


Pataballa 4800 60 6000 .6


Ernst 6000 60 6000 .8


Hunold 9000 60 6000 1




RANK





能描述:根据


ORDER BY


子句中 表达式的值,从查询返回的每一行,计算它们与其它行的相


对位置。组内的数据按


ORDER BY


子句排序,然后给每一行赋一个号,从而形成一个序 列,该


序列从


1


开始,往后累加。每次


ORDER BY


表达式的值发生变化时,该序列也随之增加。 有同


样值的行得到同样的数字序号(认为


null


时相等的)。然而,如果两行的确得到同样的排序,则


序数将随



后跳跃



若两行序数为< /p>


1



则没有序数


2



序列将给组中的下一行分配值


3< /p>



DENSE_RANK


则没有任何跳跃 。



SAMPLE


:下例中计算每个员 工按部门分区再按薪水排序,依次出现的序列号(注意与


DENSE_RANK


函数的区别)



SELECT ment_id , _name, , RANK()



OVER (PARTITION BY ment_id ORDER BY ) as drank



FROM employees e, departments d


WHERE ment_id = ment_id


AND ment_id IN ('60', '90');



DEPARTMENT_ID LAST_NAME SALARY DRANK



------------- ------------------------- ---------- ----------


60 Lorentz 4200 1


60 Austin 4800 2


60 Pataballa 4800 2


60 Ernst 6000 4


60 Hunold 9000 5


90 Kochhar 17000 1


90 De Haan 17000 1


90 King 24000 3




RATIO_TO_REPORT



功能描述:该函数计算


expression/(sum(expression))< /p>


的值,它给出相对于总数的百分比,即当前行


< br>sum(expression)


的贡献。


< p>
SAMPLE


:下例计算每个员工的工资占该类员工总工资的百分比



SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr



FROM employees


WHERE job_id = 'PU_CLERK';



LAST_NAME SALARY RR


------------------------- ---------- ----------


Khoo 3100 .223021583


Baida 2900 .208633094


Tobias 2800 .201438849


Himuro 2600 .18705036


Colmenares 2500 .179856115




REGR_ (Linear Regression) Functions



功能描述:这些线性回归函数适合最小 二乘法回归线,有


9


个不同的回归函数可使用。



REGR_SLOPE


:返回斜率,等于

< p>
COVAR_POP(expr1, expr2) / VAR_POP(expr2)


REGR_INTERCEPT


:返回回归线的


y


截距,等于



AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2)


REGR_COUNT


:返回用于填充 回归线的非空数字对的数目



REGR_R2

< br>:返回回归线的决定系数,计算式为:



If VAR_POP(expr2) = 0 then return NULL


If VAR_POP(expr1) = 0 and VAR_POP(expr2) != 0 then return 1


If VAR_POP(expr1) > 0 and VAR_POP(expr2 != 0 then



return POWER(CORR(expr1,expr),2)


REGR_AVGX



计算回归线的自变量


(expr2)


的帄均值


去掉了空对


(expr1, expr2)




等于


AVG(expr2)

REGR_AVGY



计算回归线的应变量


(expr1)


的帄均值



去 掉了空对


(expr1, expr2)



等于


AVG(expr1)


REGR_SXX




返回值等于


REGR_COUNT(expr1, expr2) * VAR_POP(expr2)


REGR_SYY




返回值等于


REGR_COUNT(expr1, expr2) * VAR_POP(expr1)


REGR_SXY:


返回值等于


REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2)



(下面的例子都是在


SH


用户下完成的)

< p>


SAMPLE 1


:下例计算

< br>1998


年最后三个星期中两种产品(


260

< p>


270


)在周末的销售量中已开发


票数量和总数量的累积斜率和回归线的截距



SELECT _month_number



REGR_SLOPE(_sold, ty_sold)



OVER (ORDER BY _month_desc, _number_in_month) AS CUM_SLOPE,



REGR_INTERCEPT(_sold, ty_sold)



OVER (ORDER BY _month_desc, _number_in_month) AS CUM_ICPT



FROM sales s, times t


WHERE _id = _id



AND _id IN (270, 260)


AND _year=1998



AND _week_number IN (50, 51, 52)


AND _number_in_week IN (6,7)


ORDER BY _month_desc, _number_in_month;



Month Day CUM_SLOPE CUM_ICPT


---------- ---------- ---------- ----------


12 12 -68 1872


12 12 -68 1872


12 13 -20.244898 1254.36735


12 13 -20.244898 1254.36735


12 19 -18.826087 1287


12 20 62.4561404 125.28655


12 20 62.4561404 125.28655


12 20 62.4561404 125.28655


12 20 62.4561404 125.28655


12 26 67.2658228 58.9712313


12 26 67.2658228 58.9712313


12 27 37.5245541 284.958221


12 27 37.5245541 284.958221


12 27 37.5245541 284.958221



SAMPLE 2


:下例计算


1998



4


月每天的累积交易数量

< p>


SELECT UNIQUE _number_in_month,


REGR_COUNT(_sold, ty_sold)



OVER (PARTITION BY _month_number ORDER BY _number_in_month)




FROM sales s, times t


WHERE _id = _id



AND _year = 1998 AND _month_number = 4;



DAY_NUMBER_IN_MONTH Regr_Count


------------------- ----------


1 825


2 1650


3 2475


4 3300


.


.


.


26 21450


30 22200



SAMPLE 3


:下例计算


1998


年每月销售量中已 开发票数量和总数量的累积回归线决定系数



SELECT _month_number,


REGR_R2(SUM(_sold), SUM(ty_sold))


OVER (ORDER BY _month_number)


FROM sales s, times t


WHERE _id = _id


AND _year = 1998


GROUP BY _month_number


ORDER BY _month_number;



FISCAL_MONTH_NUMBER Regr_R2


------------------- ----------


1


2 1


3 .927372984


4 .807019972


5 .932745567


6 .94682861


7 .965342011


8 .955768075


9 .959542618


10 .938618575


11 .880931415


12 .882769189



SAMPLE 4


:下例计算


1998



12


月最后两周产品


260


的销售量中已开发票数量和总数量的累积


帄均值



SELECT _number_in_month,


REGR_AVGY(_sold, ty_sold)


OVER (ORDER BY _month_desc, _number_in_month)




REGR_AVGX(_sold, ty_sold)


OVER (ORDER BY _month_desc, _number_in_month)



FROM sales s, times t


WHERE _id = _id



AND _id = 260


AND _month_desc = '1998-12'


AND _week_number IN (51, 52)


ORDER BY _number_in_month;



DAY_NUMBER_IN_MONTH Regr_AvgY Regr_AvgX


------------------- ---------- ----------


14 882 24.5


14 882 24.5


15 801 22.25


15 801 22.25


16 777.6 21.6


18 642.857143 17.8571429


18 642.857143 17.8571429


20 589.5 16.375


21 544 15.1111111


22 592.363636 16.4545455


22 592.363636 16.4545455


24 553.846154 15.3846154


24 553.846154 15.3846154


26 522 14.5


27 578.4 16.0666667



SAMPLE 5


:下例计算产品


26 0



270



1998



2


月周末销售量中已开发票 数量和总数量的累积


REGR_SXY, REGR_SXX, and REGR_SYY


统计值



SELECT _number_in_month,


REGR_SXY(_sold, ty_sold)


OVER (ORDER BY _year, _month_desc)


REGR_SYY(_sold, ty_sold)


OVER (ORDER BY _year, _month_desc)



REGR_SXX(_sold, ty_sold)


OVER (ORDER BY _year, _month_desc)



FROM sales s, times t


WHERE _id = _id



AND prod_id IN (270, 260)


AND _month_desc = '1998-02'


AND _number_in_week IN (6,7)


ORDER BY _number_in_month;



DAY_NUMBER_IN_MONTH Regr_sxy Regr_syy Regr_sxx


------------------- ---------- ---------- ----------


1 18870.4 2116198.4 258.4


1 18870.4 2116198.4 258.4


1 18870.4 2116198.4 258.4


1 18870.4 2116198.4 258.4


7 18870.4 2116198.4 258.4


8 18870.4 2116198.4 258.4


14 18870.4 2116198.4 258.4


15 18870.4 2116198.4 258.4


21 18870.4 2116198.4 258.4


22 18870.4 2116198.4 258.4




ROW_NUMBER



功能描述:返回有序组中一行的偏移量,从而可用于按特定标准排序的行号。


SAMPLE


:下例返回每个员工再在每个部门中按员工 号排序后的顺序号



SELECT department_id, last_name, employee_id, ROW_NUMBER()



OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id



FROM employees


WHERE department_id < 50;



DEPARTMENT_ID LAST_NAM


E EMPLOYEE_ID EMP_ID


------------- ------------------------- ----------- ----------


10 Whalen 200 1


20 Hartstein 201 1


20 Fay 202 2


30 Raphaely 114 1


30 Khoo 115 2


30 Baida 116 3


30 Tobias 117 4


30 Himuro 118 5


30 Colmenares 119 6


40 Mavris 203 1




STDDEV



功能描述:计算当前行关于组的标准偏离。(


Standard Deviation




SAMPLE


:下例返回部门


30


按雇佣日期排序的 薪水值的累积标准偏离



SELECT last_name, hire_date,salary,



STDDEV(salary) OVER (ORDER BY hire_date)



FROM employees



WHERE department_id = 30;



LAST_NAME HIRE_DATE SALARY StdDev


------------------------- ---------- ---------- ----------


Raphaely 07-12



-94 11000 0


Khoo 18-5




-95 3100 5586.14357


Tobias 24-7




-97 2800 4650.0896


Baida 24-12



-97 2900 4035.26125


Himuro 15-11



-98 2600 3649.2465


Colmenares 10-8




-99 2500 3362.58829




STDDEV_POP



功能描述: 该函数计算总体标准偏离,并返回总体变量的帄方根,其返回值与


VAR_POP


函数的


帄方根相同。(


Standard D eviation



Population



SAMPLE


:下例返回部门


20



30



60


的薪水值的总体标准偏差



SELECT department_id, last_name, salary,



STDDEV_POP(salary) OVER (PARTITION BY department_id) AS pop_std



FROM employees


WHERE department_id in (20,30,60);



DEPARTMENT_ID LAST_NAME SALARY POP_STD



------------- ------------------------- ---------- ----------


20 Hartstein 13000 3500


20 Fay 6000 3500


30 Raphaely 11000 3069.6091


30 Khoo 3100 3069.6091


30 Baida 2900 3069.6091


30 Colmenares 2500 3069.6091


30 Himuro 2600 3069.6091


30 Tobias 2800 3069.6091


60 Hunold 9000 1722.32401


60 Ernst 6000 1722.32401


60 Austin 4800 1722.32401


60 Pataballa 4800 1722.32401


60 Lorentz 4200 1722.32401




STDDEV_SAMP



功能描述:



该函数计算累积样本标准 偏离,并返回总体变量的帄方根,其返回值与


VAR_POP


函 数的帄方根相同。(


Standard Deviation



Sample



SAMPLE


:下例返回部门


20



30



60


的薪水值的样本标准偏差



SELECT department_id, last_name, hire_date, salary,



STDDEV_SAMP(salary) OVER



(PARTITION BY department_id ORDER BY hire_date



ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_sdev



FROM employees


WHERE department_id in (20,30,60);



DEPARTMENT_ID LAST_NAME HIRE_DATE SALARY CUM_SDEV



------------- ------------------------- ---------- ---------- ----------


20 Hartstein 17-2




-96 13000


20 Fay 17-8




-97 6000 4949.74747


30 Raphaely 07-12



-94 11000


30 Khoo 18-5




-95 3100 5586.14357


30 Tobias 24-7




-97 2800 4650.0896


30 Baida 24-12



-97 2900 4035.26125


30 Himuro 15-11



-98 2600 3649.2465


30 Colmenares 10-8




-99 2500 3362.58829


60 Hunold 03-1




-90 9000


60 Ernst 21-5




-91 6000 2121.32034


60 Austin 25-6




-97 4800 2163.33077


60 Pataballa 05-2




-98 4800 1982.42276


60 Lorentz 07-2




-99 4200 1925.61678




SUM



功能描述:该函数计算组中表达式的累积和。



SAMPLE


:下例计算同一经理下员工的薪水累积值



SELECT manager_id, last_name, salary,


SUM (salary) OVER (PARTITION BY manager_id ORDER BY salary


RANGE UNBOUNDED PRECEDING) l_csum



FROM employees


WHERE manager_id in (101,103,108);



MANAGER_ID LAST_NAME SALARY L_CSUM



---------- ------------------------- ---------- ----------


101 Whalen 4400 4400


101 Mavris 6500 10900


101 Baer 10000 20900


101 Greenberg 12000 44900


101 Higgins 12000 44900


103 Lorentz 4200 4200


103 Austin 4800 13800


103 Pataballa 4800 13800


103 Ernst 6000 19800


108 Popp 6900 6900


108 Sciarra 7700 14600


108 Urman 7800 22400


108 Chen 8200 30600


108 Faviet 9000 39600




VAR_POP


功能描述:(


Variance Population


)该函数返回非空集合的总体变量(忽略


null

),


VAR_POP


进行


如下计算 :



(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr)


SAMPLE


:下例计算


1998


年每月销售的累积总体和样本变 量(本例在


SH


用户下运行)



SELECT ar_month_desc,


VAR_POP(SUM(_sold))



OVER (ORDER BY ar_month_desc)


VAR_SAMP(SUM(_sold))



OVER (ORDER BY ar_month_desc)



FROM sales s, times t


WHERE _id = _id AND ar_year = 1998


GROUP BY ar_month_desc;



CALENDAR Var_Pop Var_Samp


-------- ---------- ----------


1998-01 0


1998-02 6.1321E+11 1.2264E+12


1998-03 4.7058E+11 7.0587E+11


1998-04 4.6929E+11 6.2572E+11


1998-05 1.5524E+12 1.9405E+12


1998-06 2.3711E+12 2.8453E+12


1998-07 3.7464E+12 4.3708E+12


1998-08 3.7852E+12 4.3260E+12


1998-09 3.5753E+12 4.0222E+12


1998-10 3.4343E+12 3.8159E+12


1998-11 3.4245E+12 3.7669E+12


1998-12 4.8937E+12 5.3386E+12




VAR_SAMP



功能描述:(


Variance Sample


)该函数返回非空集合的样本变量(忽略


null


),


VAR_POP


进行如


下计算:



(SUM(expr*expr)-SUM(expr)*SUM( expr)/COUNT(expr))/(COUNT(expr)-1)


SAMP LE


:下例计算


1998


年每月销售的 累积总体和样本变量


-


-


-


-


-


-


-


-



本文更新与2021-02-08 16:42,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/615666.html

oracle用法集锦的相关文章