标签:
在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 -- 前者:访问一个分区或者结果集中之前的一行;后者:访问一个分区或者结果集中之后的一行
上面那样讲有点难理解,其实就是”错位“,实现效果就是同张表的自连接,条件是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。
2)First_Value & Last_Value -- 前者:访问一个分区或者结果集的第一行;后者:访问一个分区或者结果集的最后一行;
这个就不同解释了吧。访问分区(子集)或者整个结果集的两个边界的栏位值。
3)
标签:
原文地址:http://www.cnblogs.com/jenrrychen/p/4596644.html