📅  最后修改于: 2021-01-11 11:41:19             🧑  作者: Mango
OLAP函数类似于聚合函数,只不过聚合函数将仅返回一个值。相反,OLAP函数将提供除聚合之外的各个行。
OLAP功能内置于Teradata数据库中,以提供数据挖掘功能和趋势分析。
这些功能提供了使用标准聚合不可用的处理。 OLAP函数给出其操作结果并显示该函数使用的详细数据值。
详细行数据显示为答案集的一部分,因为输出为行格式,而不是诸如WITH的报告格式。
OLAP函数可以在所有表或视图上执行,并与INSERT / SELECT一起用于填充表。最重要的区别是,与WITH不同,这些函数可以在Queryman中使用。
句法
以下是OLAP函数的语法。
OVER
([PARTITION BY] [ORDER BY columnname][ROWS BETWEEN
UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
注意:聚合函数可以是SUM,COUNT,MIN,MAX和AVG。
例
考虑以下雇员的工资表。
Emp_Id | Gross | Deduction | NetPay |
---|---|---|---|
202001 | 40,000 | 4,000 | 36,000 |
202002 | 80,000 | 6,000 | 74,000 |
202003 | 90,000 | 7,000 | 83,000 |
202004 | 75,000 | 5,000 | 70,000 |
以下是在Salary表上查找NetPay的累计金额或运行总额的示例。
记录按Emp_Id排序,并且累计总和在NetPay列上计算。
SELECT
Emp_Id, NetPay,
SUM(Netpay) OVER(ORDER BY Emp_Id ROWS
UNBOUNDED PRECEDING) as TotalSalary
FROM Salary;
执行完上述查询后,将产生以下输出。
Emp_Id NetPay TotalSalary
202001 36000 36000
202002 74000 110000
202003 83000 193000
202004 70000 263000
QUANTILE函数用于将行划分为几个分区,每个分区中的行数大致相同。百分位数是企业中最常用的QUANTILE。
默认情况下,QUANTILE列和QUANTILE值本身都将以升序输出。
在某些情况下,可以使用ORDER BY子句对输出进行重新排序以进行显示。在这里,输出的顺序不会改变输出的含义,这与求和不同,这些求和是将值加在一起,并且所有值都必须以正确的顺序出现。
句法
以下是QUANTILE函数的语法。
SELECT QUANTILE (, , [DESC | ASC])
FROM
[QUALIFY QUANTILE () {< | > | = | <= | >=} ];
RANK函数根据提供的列对记录进行排序。 RANK函数还可以根据排名过滤返回的记录数。
RANK函数允许根据高阶或低阶对一列进行评估并与所有其他行进行比较以创建输出集。
默认情况下,该顺序将按排名列的降序进行排序,这与降序的排名相关。
RANK函数的输出是该列中的最高或最低数据值,具体取决于请求的排序。
句法
以下是使用RANK函数的语法。
SELECT RANK( [DESC | ASC] )
FROM
[GROUP BY , [ ] ] [{ ASC | DESC } ]
[QUALIFY RANK() {< | <=} ];
例
考虑下面的雇员表。
Emp_Id | First_Name | Last_Name | JoinedDate | Department_No | BirthDate |
---|---|---|---|---|---|
202001 | Mike | Richard | 3/27/2008 | 1 | 1/5/1980 |
202002 | Robert | Williams | 4/25/2013 | 1 | 3/5/1983 |
202003 | Peter | Collin | 3/21/2010 | 1 | 4/1/1983 |
202004 | Alexa | Stuart | 1/2/2017 | 2 | 11/6/1984 |
202005 | Robert | Peterson | 1/4/2015 | 2 | 12/1/1984 |
以下查询按“加入日期”对employee表的记录进行排序,并在“加入日期”上分配排名。
SELECT Emp_Id, JoinedDate, RANK()
OVER(ORDER BY JoinedDate) as Seniority
FROM Employee;
执行上述查询后,将产生以下输出。
Emp_Id JoinedDate Seniority
202001 03/27/2008 1
202003 03/21/2010 2
202002 04/25/2013 3
202005 01/04/2015 4
202004 01/02/2017 5
PARTITION BY子句按PARTITION BY子句中定义的列对数据进行分组,并在每个组中执行OLAP函数。以下是使用PARTITION BY子句的查询示例。
SELECT Emp_Id, JoinedDate, RANK()
OVER(PARTITION BY DeparmentNo ORDER BY JoinedDate) as Seniority
FROM Employee;
执行上述查询后,将产生以下输出。我们可以看到,每个部门的排名都已重置。
Emp_Id DepartmentNo JoinedDate Seniority
202001 1 03/27/2008 1
202003 1 03/21/2010 2
202002 1 04/25/2013 3
202005 2 01/04/2015 4
202004 2 01/02/2017 5