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。
示例
考虑以下薪资表。
EmployeeNo |
毛额 |
演绎 |
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() OVER
([PARTITION BY columnnlist] [ORDER BY columnlist][DESC|ASC])
示例
考虑以下员工表。
EmployeeNo |
名字 |
姓氏 |
JoinedDate |
部门ID |
出生日期 |
101 |
迈克 |
詹姆斯 |
2005/3/27 |
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