📅  最后修改于: 2020-11-29 09:08:00             🧑  作者: Mango
OLAP函数与聚合函数类似,不同之处在于聚合函数将仅返回一个值,而OLAP函数将提供除聚合之外的各个行。
以下是OLAP函数的一般语法。
OVER
([PARTITION BY] [ORDER BY columnname][ROWS BETWEEN
UNBOUDED PRECEDING AND UNBOUNDED FOLLOWING)
聚合函数可以是SUM,COUNT,MAX,MIN,AVG。
考虑下面的薪水表。
EmployeeNo | Gross | Deduction | 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 |
以下是在薪金表中查找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 | FirstName | LastName | JoinedDate | DepartmentID | BirthDate |
---|---|---|---|---|---|
101 | Mike | James | 3/27/2005 | 1 | 1/5/1980 |
102 | Robert | Williams | 4/25/2007 | 2 | 3/5/1983 |
103 | Peter | Paul | 3/21/2007 | 2 | 4/1/1983 |
104 | Alex | Stuart | 2/1/2008 | 2 | 11/6/1984 |
105 | Robert | James | 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