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。

例子

考虑下面的薪资表。

员工号 总的 扣除 网络支付
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 麦克风 詹姆士 2005年3月27日 1 1980年1月5日
102 罗伯特 威廉斯 2007年4月25日 2 1983年3月5日
103 彼得 保罗 2007年3月21日 2 1983年4月1日
104 亚历克斯 斯图尔特 2008年2月1日 2 1984年11月6日
105 罗伯特 詹姆士 2008年1月4日 3 1984年12月1日

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

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