Teradata - OLAP 函数



OLAP 函数类似于聚合函数,但聚合函数仅返回一个值,而 OLAP 函数除了聚合之外,还会提供各个行。

语法

以下是 OLAP 函数的通用语法。

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

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

示例

考虑以下 Salary 表。

员工编号 总收入 扣除 净收入
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() OVER 
([PARTITION BY columnnlist] [ORDER BY columnlist][DESC|ASC])

示例

考虑以下 Employee 表。

员工编号 名字 姓氏 入职日期 部门ID 出生日期
101 迈克 詹姆斯 3/27/2005 1 1/5/1980
102 罗伯特 威廉姆斯 4/25/2007 2 3/5/1983
103 彼得 保罗 3/21/2007 2 4/1/1983
104 亚历克斯 斯图尔特 2/1/2008 2 11/6/1984
105 罗伯特 詹姆斯 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 
广告