日期:2014-05-16  浏览次数:20469 次

ORACLE分析函数(2)

        下面,我们来解析一下分析函数的语法格式(语法格式图请参照: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