日期:2014-05-16 浏览次数:20464 次
下面,我们来解析一下分析函数的语法格式(语法格式图请参照: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