技术开发 频道

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

    【IT168 技术文档】PLSQL中有很多高级分析函数,可以很简单的处理很复杂的数学运算,甚至有些运算不用高级分析函数的话,用SQL是写不出来的喔。高级分析函数有很多的,不过俺常用到的也就几个而已, AVG、SUM、MIN、MAX这几个函数很简单,就不用多说啦!要说的几个有点复杂的:

    1、ROLLUP和CUBE函数,自动汇总数据

    select *from test_tbl的数据这样的
    col_a col_b col_c
    ---- ----- -----
    1 b1 12
    1 b1 2
    1 b2 31
    2 b2 7
    2 b3 42
    2 b3 1
    2 b3 3
    如果按A、B列进行汇总C列,用一般的方法是这样:

    select col_a,col_b,sum(col_c) from test_tbl group by col_a,col_b 结果如下
    col_a col_b sum(col_c)
    ---- ----- --------
    1 b1 14
    1 b2 31
    2 b2 7
    2 b3 46
    但是如果这时候还想按A列汇总且要C列的合计数,那就要再用两个SQL来嵌套,很麻烦,不过用rollup就简单多了:
    select nvl(col_a,'合计') col_a,nvl(col_b,decode(col_a,null,'','小计'||col_a)) col_b,sum(col_c)
    from test_tbl group by rollup(col_a,col_b),结果如下
    col_a col_b sum(col_c)
    ---- ----- --------
    1 b1 14
    1 b2 31
    1 小计1 45
    2 b2 7
    2 b3 46
    2 小计2 53
    合计 98
    结果集刚好是先按A和B汇总,然后是按A汇总,最后是全部汇总这时候如果再要按B列汇总,怎么办呢?又要用SQL嵌套吗?不是的,如果有这要求的话,改用cube函数就OK啦

    select nvl(col_a,decode(col_b,null,'合计','小计'||col_b)) col_a,nvl(col_b,decode(col_a,null,'','小计'||col_a)) col_b,sum(col_c)
    from test_tbl group by cube(col_a,col_b) 结果如下
    col_a col_b sum(col_c)
    ---- ----- --------
    1 b1 14
    1 b2 31
    1 小计1 45
    2 b2 7
    2 b3 46
    2 小计2 53
    小计b1 b1 14
    小计b2 b2 38
    小计b3 b3 46
    合计 98
    跟刚才rollup函数得到的结果集有点不一样,那就是多了些按B列的汇总行。

    2、LAG和LEAD函数,自动链接上/下行记录值

    SQL> desc test_tbl
    Name Type
    ----- ------
    COL_K NUMBER
    现在按顺序的往这个test_tbl表中插入一系列数据,下面是SQL:
    insert into test_tbl values(1)
    insert into test_tbl values(2)
    insert into test_tbl values(4)
    insert into test_tbl values(5)
    insert into test_tbl values(8)
    insert into test_tbl values(9)
    insert into test_tbl values(11)
    insert into test_tbl values(12)
    insert into test_tbl values(13)
    ........
    数据插完后,要检查插入的数据中,从最小数到最大数之间有那些数是没被插入表,找出这些数的前一个和后一个数?如这个例里从1到13当中有目字3、6、7、10没被插入表中,这些数的前一个和后一个分别是2和4、5和8、9和11,即
    PREV_VAL NEXT_VAL
    ---------- ----------
    2 4
    5 8
    9 11
    如果不用分析函数要得到这后结果集那真不敢想象是怎么样的一段SQL,但用LAG分析函数那就简单了,这样写就OK
    select prev_val,next_val from(
    select col_k next_val,lag(col_k,1,0) over (order by col_k) prev_val from test_tbl
    ) where next_val-prev_val>1
    对于LEAD函数是一样的,只不过它是往后链接而已。

0
相关文章