日期:2014-05-16 浏览次数:20546 次
下面,我们来解析一下分析函数的语法格式(语法格式图请参照:http://blog.csdn.net/yidian815/article/details/12709223)。
函数名称
对it人士来时,再简单不过的东西了,不做描述。
函数参数:
分析函数通常会具有0-3个参数。
分区子句:
通过分区子句,可以对记录集进行分区,然后针对每个分区分别进行统计运算。在分析函数中,使用分区子句不必使用()将子句包围起来。在一个查询当中,我们可以使用多个分析函数,每个分析函数可以使用独立的分区规则。如果没有指定分区子句,则默认将整个查询结果作为一个分区。
示例:
没有指定分区子句:
SQL> select rownum,prod_subcategory_id,sum(1) over( order by prod_subcategory_id rows between unbounded preceding and current row) as fx from products where prod_subcategory_id > 2053;
ROWNUM PROD_SUBCATEGORY_ID FX
---------- ------------------- ----------
2 2054 1
1 2054 2
3 2054 3
4 2054 4
5 2054 5
6 2054 6
8 2055 7
7 2055 8
9 2055 9
13 2055 10
12 2055 11
11 2055 12
10 2055 13
17 2056 14
16 2056 15
15 2056 16
14 2056 17
18 2056 18
指定分区子句:
SQL> select rownum,prod_subcategory_id,sum(1) over(partition by prod_subcategory_id order by prod_subcategory_id rows between unbounded preceding and current row) as fx from products where prod_subcategory_id > 2053;
ROWNUM PROD_SUBCATEGORY_ID FX
---------- ------------------- ----------
2 2054 1
1 2054 2
3 2054 3
4 2054 4
5 2054 5
6 2054 6
8 2055 1
7 2055 2
9 2055 3
13 2055 4
12 2055 5
11 2055 6
10 2055 7
17 2056 1
16 2056 2
15 2056 3
14 2056 4
18 2056 5
排序子句用来对分区中的数据集进行排序。在排序子句部分,我们可以指定多个字段,如果排序字段不能唯一标识一条记录,那么排序的结果可能是非唯一的,因此对于分析函数产生的结果我们需要特别注意。
1:对于分区函数CUME_DIST DENSE_RANK NTILE PERCENT_RANK RANK,每一条具有相同标识的记录,其返回结果相同。
2:row_number对于每条记录返回唯一值,但是如果order by子句不能唯一标识一条记录,ROW_NUMBER处理的结果可能是不确定的,因为其依赖于排序结果。
3: 其余分区函数的窗口子句,如果使用range子句,即逻辑范围,那么其计算结果是确定的;如果使用rows子句,及物理范围,那么计算结果有可能是不确定的,每条记录的统计结果都是不同的。例如,当前记录行的值为100,如果使用range between 2 preceding and current row,那么凡是行值在100-2和100之间的记录,均参与统计运算。而如果使用rows between 2 preceding and current row,那么在与当前行的行偏移量为2的范围之内的记录参与统计运算。因为排序的非唯一性,行偏移量之内的记录是不确定的,但是某个取值范围(range)之内的记录时确定的。
4:如果窗口子句使用了range子句,那么排序子句,只可以使用一个排序字段(多个字段无法进行取值范围的确定),且排序字段的值必须为date或者数值类型。但是以下情况除外:
– RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. &n