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 |
以下是一个示例在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表.
EmployeeNo | FirstName | LastName | JoinedDate | DepartmentID | BirthDate |
---|---|---|---|---|---|
101 | Mike | James | 3/27/2005 | 1 | 1/5/1980 |
102 | Robert | William s | 2007年4月25日 | 2 | 3/5/1983 |
103 | 彼得 | 保罗 | 2007年3月21日 | 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