Функции OLAP аналогичны агрегатным функциям, за исключением того, что агрегатные функции будут возвращать только одно значение, тогда как функция OLAP будет предоставлять отдельные строки в дополнение к агрегатам.
Синтаксис
Ниже приведен общий синтаксис функции OLAP.
<aggregate function> OVER ([PARTITION BY] [ORDER BY columnname][ROWS BETWEEN UNBOUDED PRECEDING AND UNBOUNDED FOLLOWING)
Функции агрегации могут быть SUM, COUNT, MAX, MIN, AVG.
пример
Рассмотрим следующую таблицу зарплат.
Сотрудник № | Валовой | дедукция | NetPay |
---|---|---|---|
101 | 40000 | 4000 | 36000 |
102 | 80000 | 6000 | 74000 |
103 | 90000 | 7000 | 83000 |
104 | 75000 | 5000 | 70000 |
Ниже приведен пример для определения накопленной суммы или промежуточной суммы 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])
пример
Рассмотрим следующую таблицу сотрудников.
Сотрудник № | Имя | Фамилия | JoinedDate | DepartmentID | Дата рождения |
---|---|---|---|---|---|
101 | Майк | Джеймс | 3/27/2005 | 1 | 1/5/1980 |
102 | Роберт | Williams | 4/25/2007 | 2 | 3/5/1983 |
103 | Питер | Павел | 3/21/2007 | 2 | 4/1/1983 |
104 | Alex | Стюарт | 2/1/2008 | 2 | 11/6/1984 |
105 | Роберт | Джеймс | 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;
Когда вышеуказанный запрос выполняется, он производит следующий вывод. Вы можете видеть, что ранг сбрасывается для каждого отдела.