技术开发 频道

oracle数据库PL/SQL的分析函数

    3、RANK和DENSE_RANK函数,对数据进行排名

    测试表是这样的select *from test_tbl结集如下
    COL_A COL_B
    ---------- ----------
    A 242
    A 233
    B 154
    C 287
    C 76
    D 66
    E 154
    F 154
    G 212
    G 43
    按A列来统计B列的值,用一般的SQL是这样select col_a, sum(col_b) from test_tbl group by col_a order by 2 desc 结果是这样
    COL_A SUM(COL_B)
    ---------- ----------
    A 475
    C 363
    G 255
    B 154
    F 154
    E 154
    D 66
    从这个数据集可以看出A是最大的,C是第二大的,当数据多时就不知道谁是排第几了,这时用DENSE_RANK可以达到这目的
    select col_a,sum(col_b),dense_rank() over (order by sum(col_b) desc) ranks from test_tbl group by col_a 结果如下
    COL_A SUM(COL_B) RANKS
    ---------- ---------- ----------
    A 475 1
    C 363 2
    G 255 3
    B 154 4
    F 154 4
    E 154 4
    D 66 5
    这个数据集把每个值都排了名次,可以直接看得出,相同值的名次是相同的。
    用RANK跟DENSE_RANK差不多,不过就是当出现在名次相同时,下一个名次会跳跃
    select col_a,sum(col_b),rank() over (order by sum(col_b) desc ) ranks from test_tbl group by col_a 结果如下
    COL_A SUM(COL_B) RANKS
    ---------- ---------- ----------
    A 475 1
    C 363 2
    G 255 3
    B 154 4
    F 154 4
    E 154 4
    D 66 7
    可以看到名次从4跳跃到7,就是因为名次4重复出现了两次

    实际应用中可能会比这些例子要复杂多点,可能会先对表的数据分组,然后再用分析,如
    select *from test_tbl的结果是这样的
    COL_G COL_A COL_B
    ---------- ---------- ----------
    G1 A 242
    G1 A 233
    G2 C 287
    G2 C 76
    G2 D 66
    G2 E 154
    G3 F 154
    G3 G 212
    G3 G 43
    G2 B 154
    对这个数据集按G和A列汇总B列进行排名,就要先对表按G列进行分组,然后再按A列汇总B列值进行排名
    select col_g,col_a,sum(col_b),dense_rank() over (partition by col_g order by sum(col_b) desc ) ranks
    from test_tbl
    group by col_g,col_a这个SQL加了partition by先按G列分组,结果如下
    COL_G COL_A SUM(COL_B) RANKS
    ---------- ---------- ---------- ----------
    G1 A 475 1
    G2 C 363 1
    G2 B 154 2
    G2 E 154 2
    G2 D 66 3
    G3 G 255 1
    G3 F 154 2
    可以看到名次都是在G列的组别发生变化时,就会重新开始新排列

0
相关文章