RANK函数小结

ANK():返回数据项在分组中的排名。特点:在排名相等的情况下会在名次中留下空位

DENSE_RANK():RANK不同的是它在排名相等的情况下不会在名次中留下空位

[@more@]

RANK函数小结

RANK():返回数据项在分组中的排名。特点:在排名相等的情况下会在名次中留下空位

DENSE_RANK():RANK不同的是它在排名相等的情况下不会在名次中留下空位

源数据,建表脚本见附件:

SQL> select prd_type_id,sum(amount) from all_sales where year=2003 group by prd_type_id;

PRD_TYPE_ID SUM(AMOUNT)

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

1 349535.92

2 349533.8

3 349535.92

4 699071.84

5 null

6 349535.08

7 349535.92

7 rows selected.

问题:根据sum(amount)排名,显示每个部门的名次

SQL> ;

1 select prd_type_id,sum(amount),

2 RANK() OVER (ORDER BY SUM(amount) DESC) AS rank,

3 DENSE_RANK() OVER (ORDER BY SUM(amount) DESC) AS dense_rank

4 from all_sales

5 where year=2003

6 group by prd_type_id

7* order by rank

5

null

1

1

4

699071.84

2

2

1

349535.92

3

3

3

349535.92

3

3

7

349535.92

3

3

6

349535.08

6

4

2

349533.8

7

5

注意:这里PRD_TYPE_ID列为5SUM(AMOUNT)的值为空,RANK()和DENSE-RANK在这一行的返回值为1。因为默认状态下RANK()和DENSE-RANK()在递减排序中将空值指定为最高排名1,而在递增排序中则把它指定为最低排名。

此外这里还有两个参数来限制空值的排序即:NULLS FIRSTNULLS LAST

我们还以上面的例子来看:

SQL> select prd_type_id,sum(amount),

RANK() OVER (ORDER BY SUM(amount) DESC NULLS LAST) AS rank,

DENSE_RANK() OVER (ORDER BY SUM(amount) DESC NULLS LAST) AS dense_rank

from all_sales

where year=2003

group by prd_type_id

order by rank

PRD_TYPE_ID

SUM(AMOUNT)

RANK

DENSE_RANK

4

699071.84

1

1

1

349535.92

2

2

7

349535.92

2

2

3

349535.92

2

2

6

349535.08

5

3

2

349533.8

6

4

5

null

7

5

可以看出刚才我们不使用NULLS LASTPRD_TYPE_ID5的空值的排序位于第一,现在则位于最后。

下来来看分析函数与PARTITION BY子句的结合使用:

当需要把分组划分为子分组时,那么我们便可以结合PRATITION BY子句和分析函数同时使用。如下例根据月份划分销量排名:根据月份排列对每个部门的销量排名

select prd_type_id,month,sum(amount),

rank() over(partition by month order by sum(amount) desc ) as rank

from all_sales

where year=2003

and amount is not null

group by prd_type_id,month

order by month,rank

;

PRD_TYPE_ID MONTH SUM(AMOUNT) RANK

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

4 1 40136.94 1

1 1 20069.68 2

7 1 20068.92 3

6 1 20068.91 4

2 1 20068.89 5

3 1 20068.31 6

4 2 60576.85 1

1 2 30289.3 2

7 2 30288.73 3

6 2 30288.72 4

3 2 30288.2 5

2 2 30288.05 6

4 3 80549.12 1

1 3 40275.66 2

7 3 40274.91 3

由上我们看出1月份排名第一的是prd4.

资源 附件:exp_all_sales.sql

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/271063/viewspace-912070/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/271063/viewspace-912070/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值