现在的位置: 首页 > 综合 > 正文

oracle分析函数

2013年08月23日 ⁄ 综合 ⁄ 共 2370字 ⁄ 字号 评论关闭

 oracle 分析函数

FUNCTION_NAME(<参数>,…)

OVER

(<PARTITION BY 表达式,…> <ORDER BY 表达式 <ASC | DESC> <NULLS FIRST | NULLS LAST>> <WINDOWING子句>)

缺省时相当于RANGE UNBOUNDED PRECEDING

1. 值域窗(RANGE WINDOW)

  RANGE N PRECEDING

  仅对数值或日期类型有效,选定窗为排序后当前行之前,某列(即排序列)值大于/小于(当前行该列值 ?/+ N)的所有行,因此与ORDER BY子句有关系。

2. 行窗(ROW WINDOW)

  ROWS N PRECEDING

  选定窗为当前行及之前N行。

  还可以加上BETWEEN AND 形式,例如RANGE BETWEEN m PRECEDING AND n FOLLOWING

 

1. 自动汇总函数rollup,cube!

    rollup 类似 分类小计的功能!类似以前写的group by 语句。不同在于加了rollup之后,对每个分组都有了统计的功能,而且最后还有个合计。

            1 2009-1-10 东莞 黄埔 10 5
            2 2009-1-10 汕头 增城 10 10
            3 2009-1-10 广州 增城 40 0
            4 2009-1-10 东莞 增城 20 10

    select 地点,shop, sum("总台数(T-T)") from ab group by rollup(shop,地点);

            东莞 增城 20
            东莞 黄埔 10
            东莞          30
            广州 增城 40
            广州          40
            汕头 增城 10
            汕头         10
                             80

    select 地点,shop, sum("总台数(T-T)") from ab group by cube(shop,地点);

                                  80
                         增城 70
                         黄埔 10
                东莞          30
                东莞 增城 20
                东莞 黄埔 10
                广州          40
                广州 增城 40
                汕头          10
                汕头 增城 10

二:rank 函数, rank,dense_rank,row_number    

       聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。     

      1.  RANK ( ) OVER ( [query_partition_clause] order_by_clause )  分析功能

         这个写法的order by语句必须。选吃每个分组里面排序的号。如果存在相同的排名,则不隔号。出现1224排列。

         dense_rank() over()[query_partion_clause order_by_clause]可以避免重复排序的问题 比如一个组内出现1223。

        rank() 合计功能 格式 rank(colvalue) within group (orber by partion) 计算排序的列的某个值(colvalue)的排名。

        rank 和 dense_rack区别在于dense_rack,在并列关系是,相关等级不会跳过,即出现1223的排名情况。

       上面两种函数都出现排名出现重复的情况 1234,但是row_number() over (partition_by order_by_partion)
 

三:lag,lead函数

         lag和lead函数相反,lead函数见前面的文章。

 

四:sum,avg,max,min移动计算数据

        sum() over(patition_by order_by) avg() over(partition_by order_by range between 1 preceding and 1 following )

 

五:ratio_to_report报表处理函数

      oracle 8i引入的格式如下: RATIO_TO_REPORT (expr) OVER (query_partition_clause)

       除报告详细数据外,许多报告中还包括每行总数的百分比。

       

六:first,last取基数的分析函数

       first_value(字段)over( partition_by_expr order_by_expr)

       返回组中数据窗口的第一个值。

 查询:   
        select id

        ,"总台数(T-T)"

        ,ab.地点
        , last_value("总台数(T-T)")over(partition by ab.地点 order by id desc)
        ,last_value("总台数(T-T)")over(partition by ab.地点)
        ,first_value("总台数(T-T)")over(partition by ab.地点 order by id desc)
         from ab

 结果:

      4 20 增城 20 10 20
      3 40 增城 40 10 20
      2 10 增城 10 10 20
      1 10 黄埔 10 10 10   

     

 

 

抱歉!评论已关闭.