ITPub博客

首页 > 应用开发 > IT综合 > RANK函数小结

RANK函数小结

原创 IT综合 作者:wmlm 时间:2007-04-23 17:27:31 0 删除 编辑

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列为5的SUM(AMOUNT)的值为空,RANK()和DENSE-RANK在这一行的返回值为1。因为默认状态下RANK()和DENSE-RANK()在递减排序中将空值指定为最高排名1,而在递增排序中则把它指定为最低排名。

此外这里还有两个参数来限制空值的排序即:NULLS FIRST和NULLS 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 LAST时PRD_TYPE_ID为5的空值的排序位于第一,现在则位于最后。

下来来看分析函数与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博客 ” ,链接:https://blog.itpub.net/271063/viewspace-912070/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: ROW-NUMBER()函数
请登录后发表评论 登录
全部评论

注册时间:2008-04-08

  • 博文量
    398
  • 访问量
    3716775