Chinaunix首页 | 论坛 | 博客
  • 博客访问: 981169
  • 博文数量: 358
  • 博客积分: 8185
  • 博客等级: 中将
  • 技术积分: 3751
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 16:27
个人简介

The views and opinions expressed all for my own,only for study and test, not reflect the views of Any Company and its affiliates.

文章分类

全部博文(358)

文章存档

2012年(8)

2011年(18)

2010年(50)

2009年(218)

2008年(64)

我的朋友

分类: Oracle

2009-07-24 22:28:09

一.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行。
阅读(716) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~