在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%。

分析函数(Analytic Functions)的更多相关文章

  1. Analytic Functions in Oracle

    Contents Overview and IntroductionHow Analytic Functions WorkThe SyntaxExamplesCalculate a running T ...

  2. Netezza SQL Analytic Functions 分析函数

    应用场景: 分组排序,分组累加求和... 基本语法: Func( value_expression) OVER ( [<partition_by_clause>] [<order_b ...

  3. SQL Analytic Functions 分析函数

    应用场景 主要使用在需要分组计算的场景中,根据所需的计算值可以分为两类: 1,排序类:如排序号,相邻记录等 2,聚合类:如平均值,累加求和,最大值,最末值等 语法 分析函数的语法在各大数据库中基本类似 ...

  4. Oracle分析函数之开窗子句-即WINDOWING子句

    Oracle的分析函数,对我们进行统计有很大的帮助,可以避免一些子查询等操作,在统计中,我们对开窗函数的接触较少,下面主要介绍下开窗函数的使用; http://www.itpub.net/thread ...

  5. .Net程序员学用Oracle系列(22):分析函数(OVER)

    1.函数语法 1.1.语法概述 1.2.窗口详解 1.2.1.ROWS 窗口 1.2.2.RANGE 窗口 2.函数用法 2.1.普通统计类函数 2.2.数据排序类函数 2.3.数据分布类函数 2.4 ...

  6. Oracle 10gR2分析函数

    Oracle 10gR2分析函数汇总 (Translated By caizhuoyi 2008‐9‐19) 说明:  1. 原文中底色为黄的部分翻译存在商榷之处,请大家踊跃提意见:  2. 原文中淡 ...

  7. SQL Server 分析函数和排名函数

    分析函数基于分组,计算分组内数据的聚合值,经常会和窗口函数OVER()一起使用,使用分析函数可以很方便地计算同比和环比,获得中位数,获得分组的最大值和最小值.分析函数和聚合函数不同,不需要GROUP ...

  8. oracle分析函数之windowing_clause--rows

    Some analytic functions allow the windowing_clause. In the listing of analytic functions at the end ...

  9. MySQL 8.0.2: Introducing Window Functions

    July 18, 2017MySQL, SQLDag Wanvik MySQL 8.0.2 introduces SQL window functions, or analytic functions ...

随机推荐

  1. Daily Scrum5

    总体来说,我们今天的工作遇到了一些阻碍.前期的对于代码的大量阅读并没有使我们的进度突飞猛进.今天我们完成了关于敏感词汇辨别优化和防滥用部分的代码(之后会有微博来详细介绍),但是我们无法运行程序并测试, ...

  2. text-overflow 与 word-wrap:设置使用一个省略标记...标示对象内文本的溢出。

    text-overflow 与 word-wrap text-overflow用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出时 ...

  3. 命令学习:iftop

    iftop显示带宽使用情况 http://riobard.com/2010/04/30/l2tp-over-ipsec-ubuntu/ http://jaseywang.me/2011/12/19/i ...

  4. 或许你不知道:ArrayList

    ArrayList 底层以一个transient 线性数组来存储数据,它提供了无参构造方法,和有参构造方法,用户可以通过有参构造方法来初始化长度.如果不传参数,则默认调用无参构造器,数组默认长度为10 ...

  5. Careercup - Google面试题 - 5377673471721472

    2014-05-08 22:42 题目链接 原题: How would you split a search query across multiple machines? 题目:如何把一个搜索que ...

  6. Linux网络编程实例解析

    **************************************************************************************************** ...

  7. 【CentOS】设置静态IP

      问题描述:         CentOS配置静态IP   问题解决:         (1)修改IP--修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth ...

  8. Leetcode#49 Anagrams

    原题地址 Anagram:变位词.两个单词是变位词关系的条件是:组成单词的字符相同,只是顺序不同 第一次看这道题看了半天没明白要干嘛,丫就不能给个样例输入输出么..后来还是看网上其他人的总结知道是怎么 ...

  9. 【转载】C++编译出现 error C2664: 不能将参数 2 从“const char [5]”转换为“LPCTSTR”解决办法。

    编译程序的时候出现这样的错误,原因是在新建MFC项目的时候,设置字符集Unicode的属性. 解决方法一: 在VC2010的解决方案管理器窗口内,右击你的项目“项目”,然后选“属性”(最后一项),再点 ...

  10. nginx 杂记

    接触nginx一段时间,有些自己的心得,偶尔在网上会看到一些细小的知识点,总结于此 nginx是以多进程的方式来工作的.nginx在启动后,会有一个master进程和多个worker进程. maste ...