Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询和修改数据 » OLAP 支持 » SQL Anywhere 中的窗口函数

 

标准差和方差函数

SQL Anywhere 支持两个版本的方差和标准差函数:一个样本版本,一个总体版本。根据使用函数的统计上下文来在两种版本间进行选择。

所有方差和标准差函数都是真集合函数,因为它们可以按照查询的 GROUP BY 子句所确定的方式来计算行分区的值。与其它基本集合函数(例如 MAX 或 MIN)一样,它们执行的计算也会忽略输入中的 NULL 值。

为提高性能,SQL Anywhere 在一步中计算平均值和离均差。这意味着只需进行一次数据传递。

此外,无论被分析表达式的域如何,都将使用 IEEE 双精度浮点型完成所有方差和标准差计算。如果任何方差或标准差函数的输入是空集,则每个函数将返回 NULL 作为其结果。如果对单个行计算 VAR_SAMP,则它将返回 NULL,而计算 VAR_POP 将返回值 0。

以下是 SQL Anywhere 中所提供的标准差和方差函数:

要查看这些函数所表示的数学公式,请参见集合函数的数学公式

STDDEV 函数

此函数是 STDDEV_SAMP 函数的别名。请参见STDDEV_SAMP 函数 [Aggregate]

STDDEV_POP 函数

此函数计算由数字表达式组成的总体的标准差,类型为 DOUBLE。

示例 1

下面的查询返回一个结果集,该结果集显示了其薪水比其部门平均薪水高一个标准差的雇员。标准差是反映数据与平均值之间的差异的测量单位。

SELECT *
FROM ( SELECT 
    Surname AS Employee, 
    DepartmentID AS Department, 
    CAST( Salary as DECIMAL( 10, 2 ) ) 
        AS Salary,
    CAST( AVG( Salary ) 
        OVER ( PARTITION BY DepartmentID ) AS DECIMAL ( 10, 2 ) ) 
        AS Average,
    CAST( STDDEV_POP( Salary )
        OVER ( PARTITION BY DepartmentID ) AS DECIMAL ( 10, 2 ) ) 
        AS StandardDeviation
    FROM Employees
    GROUP BY Department, Employee, Salary )
    AS DerivedTable
WHERE Salary > Average + StandardDeviation
ORDER BY Department, Salary, Employee;

下表是查询的结果集。每个部门至少有一名雇员的薪水远远偏离于平均值。

Employee Department Salary Average StandardDeviation
1 Lull 100 87900.00 58736.28 16829.60
2 Scheffield 100 87900.00 58736.28 16829.60
3 Scott 100 96300.00 58736.28 16829.60
4 Sterling 200 64900.00 48390.95 13869.60
5 Savarino 200 72300.00 48390.95 13869.60
6 Kelly 200 87500.00 48390.95 13869.60
7 Shea 300 138948.00 59500.00 30752.40
8 Blaikie 400 54900.00 43640.67 11194.02
9 Morris 400 61300.00 43640.67 11194.02
10 Evans 400 68940.00 43640.67 11194.02
11 Martinez 500 55500.00 33752.20 9084.50

雇员 Scott 的收入为 $96,300.00,而部门平均收入为 $58,736.28。该部门的标准差是 $16,829.00,这表示低于 $75,565.88 (58736.28 + 16829.60 = 75565.88) 的薪水会在平均值的一个标准差范围内。雇员 Scott 的薪水 $96,300.00 远远高于该数字。

此示例假设每个雇员的 Surname 和 Salary 唯一,而实际情况不一定如此。为确保唯一性,应向 GROUP BY 子句添加 EmployeeID。

示例 2

以下语句列出不同时间段每个订单的产品数目的平均值和方差:

SELECT YEAR( ShipDate ) AS Year,
    QUARTER( ShipDate ) AS Quarter,
    AVG( Quantity ) AS Average,
    STDDEV_POP( Quantity ) AS Variance
FROM SalesOrderItems
GROUP BY Year, Quarter
ORDER BY Year, Quarter;

此查询会返回以下结果:

Year Quarter Average Variance
2000 1 25.775148 14.2794...
2000 2 27.050847 15.0270...
... ... ... ...

有关此函数语法的详细信息,请参见STDDEV_SAMP 函数 [Aggregate]

STDDEV_SAMP 函数

此函数计算由数字表达式组成的样本的标准差,类型为 DOUBLE。例如,以下语句返回不同季度每个订单的产品数目的平均值和方差:

SELECT YEAR( ShipDate ) AS Year,
    QUARTER( ShipDate ) AS Quarter,
    AVG( Quantity ) AS Average,
    STDDEV_SAMP( Quantity ) AS Variance
FROM SalesOrderItems
GROUP BY Year, Quarter
ORDER BY Year, Quarter;

此查询会返回以下结果:

Year Quarter Average Variance
2000 1 25.775148 14.3218...
2000 2 27.050847 15.0696...
... ... ... ...

有关此函数语法的详细信息,请参见STDDEV_POP 函数 [Aggregate]

VARIANCE 函数

此函数是 VAR_SAMP 函数的别名。请参见VAR_SAMP 函数 [Aggregate]

VAR_POP 函数

此函数计算由数字表达式组成的总体的统计方差,类型为 DOUBLE。例如,以下语句列出不同时间段每个订单的产品数目的平均值和方差:

SELECT YEAR( ShipDate ) AS Year,
    QUARTER( ShipDate ) AS Quarter,
    AVG( Quantity ) AS Average,
    VAR_POP( quantity ) AS Variance
FROM SalesOrderItems
GROUP BY Year, Quarter
ORDER BY Year, Quarter;

此查询会返回以下结果:

Year Quarter Average Variance
2000 1 25.775148 203.9021...
2000 2 27.050847 225.8109...
... ... ... ...

如果对单个行计算 VAR_POP,则它将返回值 0。

有关此函数语法的详细信息,请参见VAR_POP 函数 [Aggregate]

VAR_SAMP 函数

此函数计算由数字表达式组成的样本的统计方差,类型为 DOUBLE。

例如,以下语句列出不同时间段每个订单的产品数目的平均值和方差:

SELECT YEAR( ShipDate ) AS Year,
    QUARTER( ShipDate ) AS Quarter,
    AVG( Quantity ) AS Average,
    VAR_SAMP( Quantity ) AS Variance
FROM SalesOrderItems
GROUP BY Year, Quarter
ORDER BY Year, Quarter;

此查询会返回以下结果:

Year Quarter Average Variance
2000 1 25.775148 205.1158...
2000 2 27.050847 227.0939...
... ... ... ...

如果对单个行计算 VAR_SAMP,则它将返回 NULL。

有关此函数语法的详细信息,请参见VAR_SAMP 函数 [Aggregate]