设为首页 收藏本站
查看: 1060|回复: 0

[经验分享] ORACLE分析函数(5)---其他

[复制链接]

尚未签到

发表于 2016-7-20 12:14:45 | 显示全部楼层 |阅读模式
  1.除了使用数字来指定窗口范围,我们还可以使用日期类型,如:
http://img.blog.csdn.net/20131016104751750?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWlkaWFuODE1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

  2.lead和lag,返回当前窗口中与当前记录距离为n的记录。lag为向前取记录,lead为向后取记录
  

SELECT prod_id,
lag(prod_list_price,1) over(order by prod_id) pre_1,
lag(prod_list_price,2) over(order by prod_id) pre_2,
prod_list_price,
lead(prod_list_price,1) over(order by prod_id) lead_1,
lead(prod_list_price,2) over(order by prod_id) lead_2
FROM products;
   PROD_ID      PRE_1      PRE_2 PROD_LIST_PRICE     LEAD_1     LEAD_2
---------- ---------- ---------- --------------- ---------- ----------
13                                899.99     999.99     999.99
14     899.99                     999.99     999.99     299.99
15     999.99     899.99          999.99     299.99    1099.99
16     999.99     999.99          299.99    1099.99    1299.99
17     299.99     999.99         1099.99    1299.99      55.99
18    1099.99     299.99         1299.99      55.99     599.99
19    1299.99    1099.99           55.99     599.99     899.99
20      55.99    1299.99          599.99     899.99      24.99
21     599.99      55.99          899.99      24.99      21.99
22     899.99     599.99           24.99      21.99      45.99
23      24.99     899.99           21.99      45.99     112.99
24      21.99      24.99           45.99     112.99     149.99
25      45.99      21.99          112.99     149.99      44.99
26     112.99      45.99          149.99      44.99     199.99
27     149.99     112.99           44.99     199.99     499.99
28      44.99     149.99          199.99     499.99       9.99
29     199.99      44.99          499.99       9.99       8.99
30     499.99     199.99            9.99       8.99      67.99
31       9.99     499.99            8.99      67.99      44.99
32       8.99       9.99           67.99      44.99      39.99
33      67.99       8.99           44.99      39.99      49.99
34      44.99      67.99           39.99      49.99      44.99
35      39.99      44.99           49.99      44.99      54.99
36      49.99      39.99           44.99      54.99      29.99

3.frist_value last_value返回当前窗口的第一条记录和最后一条记录
SELECT prod_id,
first_value(prod_list_price) over( order by prod_id rows BETWEEN 1 preceding AND 1 following) pre_prod_price,
prod_list_price,
last_value(prod_list_price) over( order by prod_id rows BETWEEN 1 preceding AND 1 following) next_prod_price
FROM products;
   PROD_ID PRE_PROD_PRICE PROD_LIST_PRICE NEXT_PROD_PRICE
---------- -------------- --------------- ---------------
13         899.99          899.99          999.99
14         899.99          999.99          999.99
15         999.99          999.99          299.99
16         999.99          299.99         1099.99
17         299.99         1099.99         1299.99
18        1099.99         1299.99           55.99
19        1299.99           55.99          599.99
20          55.99          599.99          899.99
21         599.99          899.99           24.99
22         899.99           24.99           21.99
23          24.99           21.99           45.99
24          21.99           45.99          112.99
25          45.99          112.99          149.99
26         112.99          149.99           44.99
27         149.99           44.99          199.99
28          44.99          199.99          499.99
29         199.99          499.99            9.99
30         499.99            9.99            8.99
31           9.99            8.99           67.99
32           8.99           67.99           44.99
33          67.99           44.99           39.99
34          44.99           39.99           49.99
35          39.99           49.99           44.99
36          49.99           44.99           54.99
37          44.99           54.99           29.99

4.性能小贴士

如果我们使用sum(col2)over(order by col1 range between unbounded preceding and unbounded following ) ,此时每条记录都会进行统计运算,执行效率不高,而如果使用sum(col2) over()则仅仅统计一次,执行效率就会有所提升。下面的示例显示,效率为1/3  
  

SQL> /
COUNT(*)
----------
918843
已用时间:  00: 00: 00.81
SQL> select count(*) from (
select prod_id,sum(amount_sold) over () from sales)
;  2    3  
COUNT(*)
----------
918843
已用时间:  00: 00: 00.27

5.ration_to_report统计当前记录在当前窗口中所占的百分比  
  

SQL> select prod_id,prod_list_price,sum(prod_list_price) over() tsum,ratio_to_report(prod_list_price) over() fx from products;
PROD_ID PROD_LIST_PRICE       TSUM         FX
---------- --------------- ---------- ----------
13          899.99   10047.28 .089575487
14          999.99   10047.28  .09952843
15          999.99   10047.28  .09952843
16          299.99   10047.28 .029857832
17         1099.99   10047.28 .109481372
18         1299.99   10047.28 .129387257
19           55.99   10047.28 .005572652
20          599.99   10047.28  .05971666
21          899.99   10047.28 .089575487
22           24.99   10047.28  .00248724
23           21.99   10047.28 .002188652
24           45.99   10047.28 .004577358
25          112.99   10047.28  .01124583
26          149.99   10047.28 .014928418
27           44.99   10047.28 .004477829
28          199.99   10047.28  .01990489
29          499.99   10047.28 .049763717
30            9.99   10047.28 .000994299
31            8.99   10047.28  .00089477
32           67.99   10047.28 .006767006
33           44.99   10047.28 .004477829
34           39.99   10047.28 .003980182
35           49.99   10047.28 .004975476
36           44.99   10047.28 .004477829
37           54.99   10047.28 .005473123
38           29.99   10047.28 .002984887
39           34.99   10047.28 .003482535
40           44.99   10047.28 .004477829
41           44.99   10047.28 .004477829
42           44.99   10047.28 .004477829
43           44.99   10047.28 .004477829
44           44.99   10047.28 .004477829
45           44.99   10047.28 .004477829
46           22.99   10047.28 .002288181
47           28.99   10047.28 .002885358
48           11.99   10047.28 .001193358
113           22.99   10047.28 .002288181
114           18.99   10047.28 .001890064
115            8.99   10047.28  .00089477
116           11.99   10047.28 .001193358
117            8.99   10047.28  .00089477
118            7.99   10047.28  .00079524
119            6.99   10047.28 .000695711
120            6.99   10047.28 .000695711
121           10.99   10047.28 .001093828
122           18.99   10047.28 .001890064
123           49.99   10047.28 .004975476
124           18.99   10047.28 .001890064
125           15.99   10047.28 .001591476
126           28.99   10047.28 .002885358
127           36.99   10047.28 .003681593
128           27.99   10047.28 .002785829
129          192.99   10047.28 .019208184
130           89.99   10047.28 .008956653
131           18.99   10047.28 .001890064
132           24.99   10047.28  .00248724
133           30.99   10047.28 .003084417
134           20.99   10047.28 .002089123
135           49.99   10047.28 .004975476
136           32.99   10047.28 .003283476
137           52.99   10047.28 .005274064
138           69.99   10047.28 .006966064
139           19.99   10047.28 .001989593
140           29.99   10047.28 .002984887
141           29.99   10047.28 .002984887
142           19.99   10047.28 .001989593
143           19.99   10047.28 .001989593
144            7.99   10047.28  .00079524
145           12.99   10047.28 .001292887
146           11.99   10047.28 .001193358
147            7.99   10047.28  .00079524
148           20.99   10047.28 .002089123


  
  注意:
  
      部分分析函数在选择列时支持distinct,如果你指定了该参数,则over条件中就只能指定partition子句,而不能再指定orderby子句了


  

  

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-246963-1-1.html 上篇帖子: ORACLE 11g基本参数配置 下篇帖子: windows7安装oracle出错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表