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

[经验分享] Oracle分析函数使用总结 转

[复制链接]

尚未签到

发表于 2016-8-4 12:39:32 | 显示全部楼层 |阅读模式
Oracle分析函数使用总结
1.       使用评级函数
评级函数(rankingfunction)用于计算等级、百分点、n分片等等,下面是几个常用到的评级函数:
RANK():返回数据项在分组中的排名。特点:在排名相等的情况下会在名次中留下空位
DENSE_RANK():RANK不同的是它在排名相等的情况下不会在名次中留下空位
CUME_DIST():返回特定值相对于一组值的位置:他是“cumulativedistribution(累积分布)的简写
PERCENT_RANK():返回某个值相对于一组值的百分比排名
NTILE():返回n分片后的值,比如三分片、四分片等等
ROW_NUMBER():为每一条分组纪录返回一个数字
下面我们分别举例来说明这些函数的使用
1RANK()与DENSE-RANK()
首先显示下我们的源表数据的结构及部分数据:
SQL>desc all_sales;
 名称                                     是否为空? 类型
 ----------------------------------------- -------- -----------
 YEAR                                     NOT NULL NUMBER(38)
 MONTH                                    NOT NULL NUMBER(38)
 PRD_TYPE_ID                              NOT NULL NUMBER(38)
 EMP_ID                                   NOT NULL NUMBER(38)
 AMOUNT                                            NUMBER(8,2)
SQL>select * from all_sales where rownum<11;
 
      YEAR      MONTH PRD_TYPE_ID     EMP_ID     AMOUNT
-------------------- ----------- ---------- ----------
      2003          1           1         21   10034.84
      2003          2           1         21   15144.65
      2003          3           1         21   20137.83
      2003          4           1         21   25057.45
      2003          5           1         21   17214.56
      2003          6           1         21   15564.64
      2003          7           1         21   12654.84
      2003          8           1         21   17434.82
      2003          9           1         21   19854.57
      2003         10           1         21   21754.19
 
已选择10行。
好接下来我们将举例来说明上述函数的使用:首先是RANK()与DENSE-RANK()的使用:
SQL>select
  2   prd_type_id,sum(amount),
  3   RANK()OVER(ORDER BY SUM(amount) DESC) AS rank,
  4   DENSE_RANK()OVER(ORDER BY SUM(amount) DESC) AS dense_rank
  5  from all_sales
  6  where year=2003
  7  group by prd_type_id
  8  order by rank;
PRD_TYPE_IDSUM(AMOUNT)       RANK DENSE_RANK
---------------------- ---------- ----------
          5                      1          1
          1   905081.84          2          2
          3   478270.91          3          3
          4   402751.16          4          4
          2   186381.22          5          5
注意:这里PRD_TYPE_ID列为5SUM(AMOUNT)的值为空,RANK()和DENSE-RANK在这一行的返回值为1。因为默认状态下RANK()和DENSE-RANK()在递减排序中将空值指定为最高排名1,而在递增排序中则把它指定为最低排名。这里还有一个问题就是我们的例子中没有SUM(AMOUNT)相等的值,如果有的话RANKDENSE-RANK将表现出区别比如上面的例子如果PRD_TYPE_ID4SUMAMOUNT)的值也为:478270.91的话,那么上面语句的输出则为:
PRD_TYPE_IDSUM(AMOUNT)       RANK DENSE_RANK
---------------------- ---------- ----------
          5                      1          1
          1   905081.84          2          2
          3   478270.91          3          3
          4   478270.91          3         3
          2   186381.22          5          4
此外这里还有两个参数来限制空值的排序即:NULLSFIRSTNULLSLAST
我们还以上面的例子来看:
SQL>select
  2   prd_type_id,sum(amount),
  3   RANK() OVER (ORDER BY SUM(amount) DESC NULLS LAST) AS rank,
  4   DENSE_RANK() OVER (ORDER BY SUM(amount) DESC NULLS LAST) AS dense_rank
  5  from all_sales
  6  where year=2003
  7  group by prd_type_id
  8* order by rank
 
PRD_TYPE_IDSUM(AMOUNT)       RANK DENSE_RANK
---------------------- ---------- ----------
          1   905081.84          1          1
          3   478270.91          2          2
          4   402751.16          3          3
          2   186381.22          4          4
          5                      5          5
可以看出刚才我们不使用NULLS LASTPRD_TYPE_ID5的空值的排序位于第一,现在则位于第五。
接下来来看分析函数与PARTITIONBY子句的结合使用:
当需要把分组划分为子分组时,那么我们便可以结合PRATITIONBY子句和分析函数同时使用。如下例根据月份划分销量:
SQL>select
  2   prd_type_id,month,SUM(amount),
  3   RANK() OVER (PARTITION BYmonth ORDER BY SUM(amount) DESC) AS rank
  4  from all_sales
  5  where year=2003
  6  and amount IS NOT NULL
  7  GROUP BY prd_type_id,month
  8* ORDER BY month,rank
PRD_TYPE_ID      MONTH SUM(AMOUNT)       RANK
--------------------- ----------- ----------
          1          1    38909.04          1
          3          1    24909.04          2
          4          1    17398.43          3
          2          1    14309.04          4
          1          2     70567.9          1
          4          2     17267.9          2
          3         2     15467.9          3
          2          2     13367.9          4
          1          3    91826.98          1
          4          3    31026.98          2
          3          3    20626.98          3
 
PRD_TYPE_ID      MONTH SUM(AMOUNT)       RANK
--------------------- ----------- ----------
          2          3    16826.98          4
          1          4    120344.7          1
          3          4     23844.7          2
          4          4     16144.7          3
          2          4     15664.7          4
          1          5    97287.36          1
          4          5    20087.36          2
          3          5    18687.36          3
          2          5    18287.36          4
          1          6    57387.84          1
          4          6    33087.84          2
 
PRD_TYPE_ID      MONTH SUM(AMOUNT)       RANK
--------------------- ----------- ----------
          3          6    19887.84          3
          2          6    14587.84          4
          3          7    81589.04          1
          1          7    60929.04          2
          2          7    15689.04          3
          4          7    12089.04          4
          1          8    75608.92          1
          3          8    62408.92          2
          4          8    58408.92          3
          2          8    16308.92          4
          1          9    85027.42          1
 
PRD_TYPE_ID      MONTH SUM(AMOUNT)       RANK
--------------------- ----------- ----------
          4          9    49327.42          2
          3          9    46127.42          3
          2          9    19127.42          4
          1         10   105305.22          1
          4         10    75325.14          2
          3         10    70325.29          3
          2        10    13525.14          4
          1         11    55678.38          1
          3         11    46187.38          2
          4         11    42178.38          3
          2         11    16177.84          4
 
PRD_TYPE_ID      MONTH SUM(AMOUNT)       RANK
--------------------- ----------- ----------
          3         12    48209.04          1
          1         12    46209.04          2
          4         12    30409.05          3
          2         12    12509.04          4
 
已选择48行。
接下来我们再来看分析函数与我们上次学的ROLLUPCUBEGROUPINGSETS的结合使用:
SELECT
 prd_type_id,SUM(amount),
 RANK() OVER (ORDERBYSUM(amount)DESC NULLS LAST) ASrank
FROMall_sales
WHEREyear=
2003
GROUPBY
ROLLUP(prd_type_id)
ORDERBYrank;

 
PRD_TYPE_ID  SUM(AMOUNT)        RANK
         1972485.13         1                    (注:RULLUP的总计排在了最前)
1       905081.84  2
3       478270.91  3
4       402751.16  4
2       186381.22  5
5                      6
SELECT
 prd_type_id,emp_id,SUM(amount),
 RANK() OVER (ORDERBYSUM(amount)DESCNULLSLAST) ASrank
FROMall_sales
WHEREyear=
2003
GROUPBY
CUBE(prd_type_id,emp_id)
ORDERBYprd_type_id,emp_id;

PRD_TYPE_ID     EMP_ID SUM(AMOUNT)       RANK
--------------------- ----------- ----------
          1         21   197916.96         12
          1         22   214216.96         10
          1         23    98896.96         19
          1         24   207216.96         11
          1         25    93416.96         21
          1         26    93417.04         20
          1              905081.84          2
          2         21    20426.96         33
          2         22    19826.96         34
          2         23    19726.96         35
          2         24    43866.96         27
 
PRD_TYPE_ID     EMP_ID SUM(AMOUNT)       RANK
--------------------- ----------- ----------
          2         25    32266.96         31
          2         26    50266.42         24
          2              186381.22         14
          3         21   140326.96         15
          3         22   116826.96         16
          3         23   112026.96         17
          3        24    34829.96         29
          3         25    29129.96         32
          3         26    45130.11         26
          3              478270.91          3
          4         21   108326.96         18
 
PRD_TYPE_ID     EMP_ID SUM(AMOUNT)       RANK
--------------------- ----------- ----------
          4         22    81426.96         23
          4         23    92426.96         22
          4         24    47456.96         25
          4         25    33156.96         30
          4        26    39956.36         28
          4              402751.16          6
          5         21                     36
          5         22                     36
          5         23                     36
          5         24                     36
          5         25                     36
 
PRD_TYPE_ID     EMP_ID SUM(AMOUNT)       RANK
--------------------- ----------- ----------
          5         26                     36
          5                               36
                    21   466997.84          4
                    22   432297.84          5
                    23   323077.84          8
                    24   333370.84          7
                    25   187970.84         13

                    26   22876

运维网声明 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-252751-1-1.html 上篇帖子: Oracle 数据库常用的函数 下篇帖子: Oracle学习记录之表查询
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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