oracle数据库sql查询分析,60.Oracle数据库SQL开发之 高级查询——使用分析函数之评级函数...

60.Oracle数据库SQL开发之 高级查询——使用分析函数之评级函数

数据库中有很多内置的分析函数,能够执行复杂的计算。分析函数可以分为很多类。

评级函数,反百分比点函数,窗口函数,报表函数,延迟与领先函数,首函数与末函数,线性回归函数,假想评级及分布函数。

先执行如下:

store@PDB1> select * from all_sales where rownum<= 12;

YEAR    MONTH PRD_TYPE_ID     EMP_ID     AMOUNT

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

2003         8                5        23

2003         9                5        23

2003        10                5        23

2003        11                5        23

2003        12                5        23

2003         1                5        24

2003         2                5        24

2003         3                5        24

2003         4                5        24

2003         5                5        24

2003         6                5        24

2003         7                5        24

12 rows selected.

如下图1:

0818b9ca8b590ca3270a3433284dd417.png

1.  使用RANK和DENSE_RANK函数

可以计算数据项在分组中的排名。两个函数之间的区别在于处理相等数据项的方式。

两个函数之前的出别是在处理相等数据项的方式不同。

store@PDB1> select prd_type_id,sum(amount),rank()over (order by sum(amount) desc) as rank,

dense_rank() over (order by sum(amount) desc) as dense_rank fromall_sales where year=2003 and amount is not null group by prd_type_id order byprd_type_id;

PRD_TYPE_ID SUM(AMOUNT)       RANK DENSE_RANK

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

1  905081.84  1         1

2  186381.22  4         4

3  478270.91  2         2

4  402751.16  3         3

2.   使用NULLS FIRST和NULLS LAST子句控制控制的排名

可以使用NULLS FIRST和NULLS LAST显示地控制控制是一个分组中最高还是最低的排名。

store@PDB1> select prd_type_id,sum(amount),rank()over (order by sum(amount) desc nulls last) as rank,dense_rank() over (order bysum(amount) desc nulls last) as dense_rank from all_sales where year=2003 groupby prd_type_id order by prd_type_id;

PRD_TYPE_ID SUM(AMOUNT)       RANK DENSE_RANK

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

1  905081.84  1         1

2  186381.22  4         4

3  478270.91  2         2

4  402751.16  3         3

5                     5        5

使用NULLS LAST将空值指定为最低。

3.   分析函数与PARTITION BY子句结合使用

要将分组划分为自分组时,可以将PARTITION BY子句和分析函数结合起来使用。

例如:

store@PDB1> selectprd_type_id,month,sum(amount),rank() over (partition by month order bysum(amount) desc) as rank

fromall_sales where year=2003 and amount is not null group by prd_type_id,monthorder by prd_type_id,month;

PRD_TYPE_ID  MONTH SUM(AMOUNT)        RANK

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

1       1       38909.04          1

1       2        70567.9          1

1       3       91826.98          1

1       4       120344.7          1

1       5       97287.36          1

1       6      57387.84          1

1       7       60929.04          2

1       8       75608.92          1

1       9       85027.42          1

1      10     105305.22          1

1      11       55678.38          1

1      12       46209.04          2

2       1       14309.04          4

2       2        13367.9          4

2       3       16826.98          4

2       4        15664.7          4

2       5       18287.36          4

2       6       14587.84          4

2       7       15689.04          3

2       8       16308.92          4

2       9       19127.42          4

2      10       13525.14          4

2      11       16177.84          4

2      12       12509.04          4

3       1       24909.04          2

3       2        15467.9          3

3       3       20626.98          3

3       4        23844.7          2

3       5       18687.36          3

3       6       19887.84          3

3       7       81589.04          1

3       8       62408.92          2

3       9       46127.42          3

3      10       70325.29          3

3      11       46187.38          2

3      12       48209.04          1

4       1       17398.43          3

4       2        17267.9          2

4       3       31026.98          2

4       4        16144.7          3

4       5      20087.36          2

4       6       33087.84          2

4       7       12089.04          4

4       8       58408.92          3

4       9       49327.42          2

4      10       75325.14          2

4      11       42178.38          3

4      12       30409.05          3

48 rows selected.

4.   分析函数与ROLLUP,CUBE,GROUPINGSETS操作符结合使用

用ROLLUP和RANK获得不同产品类型ID的销售排名:

store@PDB1> select prd_type_id,sum(amount),rank()over (order by sum(amount) desc) as rank from all_sales

whereyear=2003 group by rollup(prd_type_id) order by prd_type_id;

PRD_TYPE_ID SUM(AMOUNT)       RANK

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

1  905081.84  3

2  186381.22  6

3  478270.91  4

4  402751.16  5

5                     1

1972485.13  2

6 rows selected.

用CUBE和RANK根据产品类型ID和员工ID获得销售排名:

store@PDB1> select prd_type_id,sum(amount),rank()over (order by sum(amount) desc) as rank from all_sales where year = 2003 groupby cube(prd_type_id,emp_id) order by prd_type_id,emp_id;

PRD_TYPE_ID SUM(AMOUNT)       RANK

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

1  197916.96 19

1  214216.96 17

1   98896.96 26

1  207216.96 18

1   93416.96 28

1   93417.04 27

1  905081.84  9

2   20426.96 40

2   19826.96 41

2   19726.96 42

2   43866.96 34

2   32266.96 38

2   50266.42 31

2   186381.22 21

3  140326.96 22

3  116826.96 23

3  112026.96 24

3   34829.96 36

3   29129.96 39

3   45130.11 33

3  478270.91 10

4  108326.96 25

4   81426.96 30

4   92426.96 29

4   47456.96 32

4    33156.96 37

4   39956.36 35

4  402751.16 13

5                     1

5                     1

5                     1

5                     1

5                     1

5                     1

5                     1

466997.84 11

432297.84 12

323077.84 15

333370.84 14

187970.84 20

228769.93 16

1972485.13  8

42 rows selected.

使用GROUPING SETS和RANK获得销量小计的排名:

store@PDB1> select prd_type_id,sum(amount),rank() over (order by sum(amount) desc)as rank from all_sales where year = 2003 group by groupingsets(prd_type_id,emp_id) order by prd_type_id,emp_id;

PRD_TYPE_ID SUM(AMOUNT)       RANK

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

1  905081.84  2

2  186381.22 11

3  478270.91  3

4  402751.16  6

5                     1

466997.84  4

432297.84  5

323077.84  8

333370.84  7

187970.84 10

228769.93  9

11 rows selected.

5.   使用CUME_DIST和PERCENT_RANK函数

CUME_DIST函数可以计算某个特定值相对于一组值中的位置。PERCENT_RANK函数可以计算某个值相对于一组值的百分比排名。

store@PDB1> selectprd_type_id,sum(amount),cume_dist() over (order by sum(amount) desc) ascume_dist,percent_rank() over (order by sum(amount) desc) as percent_rank fromall_sales where year=2003 group by prd_type_id order by prd_type_id;

PRD_TYPE_ID SUM(AMOUNT)  CUME_DIST PERCENT_RANK

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

1   905081.84 .4         .25

2  186381.22  1           1

3  478270.91 .6          .5

4  402751.16 .8         .75

5                     .2           0

6.   使用NTILE函数

NTILE(buckets)可以计算n分片的值。Bucket指定了分片的片数。

store@PDB1> selectprd_type_id,sum(amount),ntile(4) over (order by sum(amount) desc) as ntile fromall_sales where year=2003 and amount is not null group by prd_type_id order byprd_type_id;

PRD_TYPE_ID SUM(AMOUNT)      NTILE

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

1  905081.84  1

2  186381.22  4

3  478270.91  2

4  402751.16  3

7.   使用ROW_NUMBER函数

ROW_NUMBER从1开始,为每一条分组记录返回一个数字。

store@PDB1> selectprd_type_id,sum(amount),row_number() over (order by sum(amount) desc) asrow_number from all_sales where year=2003 group by prd_type_id order byprd_type_id;

PRD_TYPE_ID SUM(AMOUNT) ROW_NUMBER

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

1  905081.84  2

2  186381.22  5

3  478270.91  3

4  402751.16  4

5                     1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值