分析函数rank,dense_rank,row_number

一.RANK聚合函数
1.语法


RANK(cntexpr1[,cntexpr2,...,cntexprn]) WITHIN GROUP (ORDER BY expr1[DESC|ASC][,expr2[DESC|ASC],...,exprn[DESC|ASC])
2.说明


计算给定组合,在一个排序集合中的所处的等级位置.
①cntexpr系列要求是常量
②相同的数值所处等级值相同
③ 下一等级值是前面所有等级记录数量加1
3.例子

SQL> select * from test;

F1 F2
---------- ----------
1 1
1 2
2 1
2 2
2 3
3 1
3 2
3 3
4 1
4 2
5 1

已选择11行。

SQL> select rank(0) within group(order by f1) r0,
2 rank(1) within group(order by f1) r1,
3 rank(2) within group(order by f1) r2,
4 rank(3) within group(order by f1) r3,
5 rank(4) within group(order by f1) r4,
6 rank(5) within group(order by f1) r5
7 from test;

R0 R1 R2 R3 R4 R5
---------- ---------- ---------- ---------- ---------- ----------
1 1 3 6 9 11


SQL> select rank(2,3) within group(order by f1,f2) r22,
2 rank(4,1) within group(order by f1,f2) r41 from test;

R22 R41
---------- ----------
5 9


SQL> select rank(2,3) within group(order by f1,f2 desc) r22,
2 rank(4,1) within group(order by f1,f2 desc) r41 from test;

R22 R41
---------- ----------
3 10


二.RANK分析函数
1.语法


RANK() OVER([PARTITION BY expr1[,expr2,..,exprn]] ORDER BY expr1[,expr2,..,exprn])
2.目的


先将记录按PARTITION分组,组内再以ORDER BY排序,算出当前记录在组内所处的级别.
PRATITION条件省略时,表明不分组,或将全录记录作为一组
3.例子

SQL> select f1,f2,
2 rank() over(order by f1) r1,
3 rank() over(order by f1,f2) r12 from test;

F1 F2 R1 R12
---------- ---------- ---------- ----------
1 1 1 1
1 2 1 2
2 1 3 3
2 2 3 4
2 3 3 5
3 1 6 6
3 2 6 7
3 3 6 8
4 1 9 9
4 2 9 10
5 1 11 11

SQL> select f1,f2,rank() over(partition by f1 order by f2) r_pf1_f2 from test;

F1 F2 R_PF1_F2
---------- ---------- ----------
1 1 1
1 2 2
2 1 1
2 2 2
2 3 3
3 1 1
3 2 2
3 3 3
4 1 1
4 2 2
5 1 1


SQL> select f1,f2,rank() over(partition by f2 order by f1) r_pf2_f1 from test;

F1 F2 R_PF2_F1
---------- ---------- ----------
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
1 2 1
2 2 2
3 2 3
4 2 4
2 3 1
3 3 2

三.ROW_NUMBER函数
1.语法


ROW_NUMBER() OVER([PARTITION BY expr1[,expr2,..,exprn]] ORDER BY expr1[,expr2,..,exprn])
2.说明


相同的记录也会有不同的ROW_NUMBER值,ROW_NUMBER值是连续的
3.例子

SQL> select f1,f2,
2 row_number() over(order by f1) r1,
3 row_number() over(order by f1,f2) r12 from test;

F1 F2 R1 R12
---------- ---------- ---------- ----------
1 1 1 1
1 2 2 2
2 1 3 3
2 2 4 4
2 3 5 5
3 1 6 6
3 2 7 7
3 3 8 8
4 1 9 9
4 2 10 10
5 1 11 11

已选择11行。

SQL> select f1,f2,row_number() over(partition by f1 order by f2) r_pf1_f2 from test;

F1 F2 R_PF1_F2
---------- ---------- ----------
1 1 1
1 2 2
2 1 1
2 2 2
2 3 3
3 1 1
3 2 2
3 3 3
4 1 1
4 2 2
5 1 1

已选择11行。

SQL> select f1,f2,row_number() over(partition by f2 order by f1) r_pf2_f1 from test;

F1 F2 R_PF2_F1
---------- ---------- ----------
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
1 2 1
2 2 2
3 2 3
4 2 4
2 3 1
3 3 2

已选择11行。

四.DENSE_RANK聚合函数
1.语法


DENSE_RANK(cntexpr1[,cntexpr2,...,cntexprn]) WITHIN GROUP (ORDER BY expr1[DESC|ASC][,expr2[DESC|ASC],...,exprn[DESC|ASC])
2.说明


计算给定组合,在一个排序集合中的所处的等级位置.
①cntexpr系列要求是常量
②相同的数值所处等级值相同
③ 等级值是连续的,从1开始.
3.例子

SQL> select dense_rank(0) within group(order by f1) r0,
2 dense_rank(1) within group(order by f1) r1,
3 dense_rank(2) within group(order by f1) r2,
4 dense_rank(3) within group(order by f1) r3,
5 dense_rank(4) within group(order by f1) r4,
6 dense_rank(5) within group(order by f1) r5
7 from test;

R0 R1 R2 R3 R4 R5
---------- ---------- ---------- ---------- ---------- ----------
1 1 2 3 4 5

五.DENSE_RANK分析函数
1.语法


DENSE_RANK() OVER([PARTITION BY expr1[,expr2,..,exprn]] ORDER BY expr1[,expr2,..,exprn])
2.目的


先将记录按PARTITION分组,组内再以ORDER BY排序,算出当前记录在组内所处的级别.
PRATITION条件省略时,表明不分组,或将全录记录作为一组
3.例子

SQL> select f1,f2,
2 dense_rank() over(order by f1) r1,
3 dense_rank() over(order by f1,f2) r12 from test;

F1 F2 R1 R12
---------- ---------- ---------- ----------
1 1 1 1
1 2 1 2
2 1 2 3
2 2 2 4
2 3 2 5
3 1 3 6
3 2 3 7
3 3 3 8
4 1 4 9
4 2 4 10
5 1 5 11

已选择11行。

SQL> select f1,f2,dense_rank() over(partition by f1 order by f2) r_pf1_f2 from t
est;

F1 F2 R_PF1_F2
---------- ---------- ----------
1 1 1
1 2 2
2 1 1
2 2 2
2 3 3
3 1 1
3 2 2
3 3 3
4 1 1
4 2 2
5 1 1

已选择11行。

SQL> select f1,f2,dense_rank() over(partition by f2 order by f1) r_pf2_f1 from t
est;

F1 F2 R_PF2_F1
---------- ---------- ----------
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
1 2 1
2 2 2
3 2 3
4 2 4
2 3 1
3 3 2

已选择11行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值