- Teradata 教程
- Teradata - 主页
- Teradata 基础知识
- Teradata - 简介
- Teradata - 安装
- Teradata - 架构
- Teradata - 关系概念
- Teradata - 数据类型
- Teradata - 表
- Teradata - 数据操作
- Teradata - SELECT 语句
- 逻辑和条件运算符
- Teradata - SET 运算符
- Teradata - 字符串操作
- Teradata - 日期/时间函数
- Teradata - 内置函数
- Teradata - 聚合函数
- Teradata - 案例与合并
- Teradata - 主索引
- Teradata - 加入
- Teradata - 子查询
- Teradata 高级版
- Teradata - 表类型
- Teradata - 空间概念
- Teradata - 二级索引
- Teradata - 统计
- Teradata - 压缩
- Teradata - 解释
- Teradata - 哈希算法
- Teradata - 连接索引
- Teradata - 视图
- Teradata - 宏
- Teradata - 存储过程
- Teradata - 加入策略
- Teradata - 分区主索引
- Teradata - OLAP 函数
- Teradata - 数据保护
- Teradata - 用户管理
- Teradata - 性能调优
- Teradata - 快速加载
- Teradata - 多负载
- Teradata - 快速导出
- Teradata-BTEQ
- Teradata 有用资源
- Teradata - 问题与解答
- Teradata - 快速指南
- Teradata - 有用的资源
- Teradata - 讨论
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