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.

示例

考虑以下薪资表.

EmployeeNoGrossDeductionNetPay
10140,0004,00036,000
10280,0006,00074,000
10390,0007,00083,000
10475,0005,00070,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函数的通用语法./p>

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

示例

考虑以下Employee表.

EmployeeNoFirstNameLastNameJoinedDateDepartmentIDBirthDate
101MikeJames3/27/200511/5/1980
102RobertWilliam s2007年4月25日23/5/1983
103彼得保罗2007年3月21日24/1/1983
104AlexStuart2/1/2008211/6/1984
105RobertJames1/4/2008312/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