Teradata - funkcje OLAP
Funkcje OLAP są podobne do funkcji agregujących, z tą różnicą, że funkcje agregujące zwracają tylko jedną wartość, podczas gdy funkcja OLAP zapewnia oprócz agregatów również pojedyncze wiersze.
Składnia
Poniżej przedstawiono ogólną składnię funkcji OLAP.
<aggregate function> OVER
([PARTITION BY] [ORDER BY columnname][ROWS BETWEEN
UNBOUDED PRECEDING AND UNBOUNDED FOLLOWING)
Funkcje agregacji mogą mieć wartości SUMA, COUNT, MAX, MIN, AVG.
Przykład
Rozważ poniższą tabelę wynagrodzeń.
Pracownik numer | obrzydliwy | Odliczenie | Płaca netto |
---|---|---|---|
101 | 40 000 | 4000 | 36.000 |
102 | 80 000 | 6000 | 74 000 |
103 | 90 000 | 7,000 | 83 000 |
104 | 75 000 | 5000 | 70 000 |
Poniżej znajduje się przykład znalezienia skumulowanej sumy lub sumy bieżącej NetPay w tabeli wynagrodzeń. Rekordy są sortowane według numeru pracownika, a skumulowana suma jest obliczana w kolumnie NetPay.
SELECT
EmployeeNo, NetPay,
SUM(Netpay) OVER(ORDER BY EmployeeNo ROWS
UNBOUNDED PRECEDING) as TotalSalary
FROM Salary;
Kiedy powyższe zapytanie jest wykonywane, generuje następujące dane wyjściowe.
EmployeeNo NetPay TotalSalary
----------- ----------- -----------
101 36000 36000
102 74000 110000
103 83000 193000
104 70000 263000
105 18000 281000
RANGA
Funkcja RANK porządkuje rekordy na podstawie podanej kolumny. Funkcja RANK może również filtrować liczbę zwracanych rekordów na podstawie rangi.
Składnia
Poniżej przedstawiono ogólną składnię używaną w funkcji POZYCJA.
RANK() OVER
([PARTITION BY columnnlist] [ORDER BY columnlist][DESC|ASC])
Przykład
Rozważ poniższą tabelę Pracownik.
Pracownik numer | Imię | Nazwisko | JoinedDate | DepartmentID | Data urodzenia |
---|---|---|---|---|---|
101 | Mikrofon | James | 27.03.2005 | 1 | 05.01.1980 |
102 | Robert | Williams | 25.04.2007 | 2 | 05.03.1983 |
103 | Piotr | Paweł | 21.03.2007 | 2 | 01.04.1983 |
104 | Alex | Stuart | 01.02.2008 | 2 | 06.11.1984 |
105 | Robert | James | 1/4/2008 | 3 | 01.12.1984 |
Następujące zapytanie porządkuje rekordy tabeli pracowników według daty dołączenia i przypisuje ranking na dzień dołączenia.
SELECT EmployeeNo, JoinedDate,RANK()
OVER(ORDER BY JoinedDate) as Seniority
FROM Employee;
Kiedy powyższe zapytanie jest wykonywane, generuje następujące dane wyjściowe.
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
Klauzula PARTITION BY grupuje dane według kolumn zdefiniowanych w klauzuli PARTITION BY i wykonuje funkcję OLAP w każdej grupie. Poniżej znajduje się przykład kwerendy używającej klauzuli PARTITION BY.
SELECT EmployeeNo, JoinedDate,RANK()
OVER(PARTITION BY DeparmentNo ORDER BY JoinedDate) as Seniority
FROM Employee;
Kiedy powyższe zapytanie jest wykonywane, generuje następujące dane wyjściowe. Jak widać, ranga jest resetowana dla każdego działu.
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