• 分析函数(Analytic Functions)


    在OLAP这类系统或者DW这类数据库中,作为某份报表的数据源,我们常常需要在某个存储过程中编写复杂的运算代码来汇总数据。分析函数便具备这样的能力,引用多行的数据值来进行多层面的聚合运算,在数据子集中进行颗粒度级别的排序控制.

     

    分析函数不能嵌套,但是可以通过用视图或者表函数封装然后再套上一层分析函数

    语法:

    function(argument1,argument2,argument3...) over ([partition by] [order by] [windowing-clause])

    和SQL Server中的Window Function其实类似,不过这里多了些不同的东西

    首先,order by子句后面跟上NULLS FIRST或者NULLS LAST来指定空值是排在前面还是后面

    开窗子句(windowing-clause)是SQL Server没有的(至少据我了解到SQL Server 2012好像还没有)。开窗子句是分析函数运算的数据子集,又称滑动窗口。我们可以使用说明子句来指定滑动窗口自的上下边界。说明子句的语法:

    [ROWS | RANGE] BETWEEN <Start expr> AND <End expr>
    Whereas
    <Start expr> is [UNBOUNDED PRECEDING | CURRENT ROW | n PRECEDING | n FOLLOWING]
    <End expr> is [UNBOUNDED FOLLOWING | CURRENT ROW | n PRECEDING | n FOLLOWING]

    比如:

    sum(sum(tot_sales)) over (order by month rows between unbounded preceding and unbounded following) total_sales

    分析函数有很多,下图来自《oracle高级编程》一书

    1) Lag & Lead -- 前者:访问一个分区或者结果集中之前的一行;后者:访问一个分区或者结果集中之后的一行

    语法:lag (expression, offset, default ) over (partition-clause order-by-clause)

    上面那样讲有点难理解,其实就是”错位“,实现效果就是同张表的自连接,条件是a.col1=a.co1+1或者a.col1=a.co1-1。结果就像这样:

    1  

    2  1

    3  2

    4  3

    上面是lag

    那lead呢

    1  2  

    2  3

    3  4

    4

    两个函数都提供了default value的选项,可以把空值补充为我们想要的值.它们俩也都能带上PARTITION BY。

     另外,偏移量也是可选的,LAG(col1, 10,xxx)说明偏移量是10。

    2)First_Value & Last_Value & Nth_value -- 前者:访问一个分区或者结果集的第一行;中间:访问一个分区或者结果集的最后一行;最后那个可以提取任意第几个值;

    这个就不同解释了吧。访问分区(子集)或者整个结果集的两个边界的栏位值。

    语法:first_value(expression) over (partition-clause order-by-clause windowing-clause)

    这个函数还有一个用处就是,经常在我们需要比如提取每个分组某个栏位值最大的哪一行,在需要提取的栏位很少的情况下其实可以用FIRST_VALUE这个函数来做。平常的做法是对整个结果集用ROW_NUMBER排序生成RowNo字段,然后RowNo = 1。

    Nth_VALUE语法:

    NTH_VALUE (measure, n ) [ FROM FIRST| FROM LAST] [RESPECT NULLS|IGNORE NULLS]
    OVER (partitioning-clause order-by-clause windowing-clause)

    FROM FIRST和RESPECT NULLS是默认

    3)Ratio_to_report:计算某个值占结果集或者分组总值的百分比

    select year, week,sale,
    trunc(100*
    ratio_to_report(sale) over(partition by product, country, region ,year)

    4 ,2) sales_yr,
    trunc(100*
    ratio_to_report(sale) over(partition by product, country, region)
    7 ,2) sales_prod
    from sales_fact
    where country in ('Australia') and product ='Xtend Memory'
    order by product, country,year, week

    4)Percent_rank:Percent_rank以0到1之间的分数形式返回某个值在数据分区中的排名。公式是(RANK-1)/(N-1),N为分区的行数或者总行数(没有分区字句的情况下)。Percent_rank函数对于计算某个值在结果集中按百分比所处的相对位置很有用。
    5)Percentile_cont:Percent_rank的反函数,通过一个0到1之间的percent值来反推出value
    6)Percentile_disc:这个函数和Percentile_cont类似,不同的是Percentile_cont使用连续分布模型,而Percentile_disc使用离散分布模型;Percentile_cont在没有找到精确匹配的情况下用相近两个值得平均值,而Percentile_disc在升序的情况下取最大那个,降序的情况下取最小的;

    7)Stddev:标准偏移。以后再研究吧这个。

    8)Listag:行转列函数。

    语法:

    Listagg (string, separator ) within group (order-by-clause)
    Over (partition-by-clause )

    足够的内存空间(PGA)对于分析函数来讲是很重要。PGAT(PGA_AGGREGATE_TARGET)的数据库初始化设置影响线程的能够分配到PGA大小,一般串行可以拿到PGAT的5%内存空间作为PGA,而并行最多不超过30%。

  • 相关阅读:
    这就是搜索引擎--读书笔记六--索引的查询
    这就是搜索引擎--读书笔记五--索引的建立与更新
    JavaWeb学习总结第四篇--Servlet开发
    算法帝国--读书笔记
    这就是搜索引擎--读书笔记四--索引基础
    这就是搜索引擎--读书笔记三
    Python学习总结之五 -- 入门函数式编程
    ASP.NET-FineUI开发实践-4(二)
    ASP.NET-FineUI开发实践-4
    ASP.NET-FineUI开发实践-3
  • 原文地址:https://www.cnblogs.com/jenrrychen/p/4596644.html
Copyright © 2020-2023  润新知