Teradata - OLAP 函数

OLAP 函数类似于聚合函数,不同之处在于聚合函数只返回一个值,而 OLAP 函数除了聚合之外还提供单独的行。

语法

以下是 OLAP 函数的一般语法。

<aggregate function> OVER
([PARTITION BY] [ORDER BY columnname][ROWS BETWEEN
UNBOUDED PRECEDING AND UNBOUDED FOLLOWING)

聚合函数可以是 SUM、COUNT、MAX、MIN、AVG。

示例

考虑以下工资表。

EmployeeNo Gross Deduction NetPay
101 40,000 4,000 36,000
102 80,000 6,000 74,000
103 90,000 7,000 83,000
104 75,000 5,000 70,000

以下是在 Salary 表中查找 NetPay 的累计总和或累计总额的示例。记录按 EmployeeNo 排序,并根据 NetPay 列计算累计总和。

SELECT  
EmployeeNo, NetPay, 
SUM(Netpay) OVER(ORDER BY EmployeeNo ROWS  
UNBOUNDED PRECEDING) as TotalSalary 
FROM Salary;

当执行上述查询时,它会产生以下输出。

EmployeeNo     NetPay     TotalSalary 
-----------  -----------  ----------- 
   101         36000        36000 
   102         74000        110000 
   103         83000        193000 
   104         70000        263000 
   105         18000        281000 

RANK

RANK 函数根据提供的列对记录进行排序。RANK 函数还可以根据排名过滤返回的记录数。

语法

以下是使用 RANK 函数的通用语法。

RANK() OVER
([PARTITION BY columnnlist] [ORDER BY columnlist][DESC|ASC])

示例

考虑以下员工表。

EmployeeNo FirstName LastName JoinedDate DepartmentID BirthDate
101 Mike James 3/27/2005 1 1/5/1980
102 Robert Williams 4/25/2007 2 3/5/1983
103 Peter Paul 3/21/2007 2 4/1/1983
104 Alex Stuart 2/1/2008 2 11/6/1984
105 Robert James 1/4/2008 3 12/1/1984

以下查询按加入日期对员工表的记录进行排序,并根据加入日期分配排名。

SELECT EmployeeNo, JoinedDate,RANK() 
OVER(ORDER BY JoinedDate) as Seniority 
FROM Employee;

当执行上述查询时,它会产生以下输出。

EmployeeNo   JoinedDate   Seniority 
-----------  ----------  ----------- 
   101       2005-03-27       1 
   103       2007-03-21       2 
   102       2007-04-25       3 
   105       2008-01-04       4 
   104       2008-02-01       5 

PARTITION BY 子句根据 PARTITION BY 子句中定义的列对数据进行分组,并在每个组内执行 OLAP 函数。以下是使用 PARTITION BY 子句的查询示例。

SELECT EmployeeNo, JoinedDate,RANK()
OVER(PARTITION BY DeparmentNo ORDER BY JoinedDate) as Seniority
FROM Employee;

执行上述查询时,会产生以下输出。您可以看到每个部门的排名都已重置。

EmployeeNo  DepartmentNo  JoinedDate   Seniority 
-----------  ------------  ----------  ----------- 

    101           1        2005-03-27       1 
    103           2        2007-03-21       1 
    102           2        2007-04-25       2 
    104           2        2008-02-01       3 
    105           3        2008-01-04       1