Teradata - Funzioni OLAP

Le funzioni OLAP sono simili alle funzioni aggregate tranne per il fatto che le funzioni aggregate restituiranno un solo valore mentre la funzione OLAP fornirà le singole righe oltre agli aggregati.

Sintassi

Di seguito è riportata la sintassi generale della funzione OLAP.

<aggregate function> OVER  
([PARTITION BY] [ORDER BY columnname][ROWS BETWEEN 
UNBOUDED PRECEDING AND UNBOUNDED FOLLOWING)

Le funzioni di aggregazione possono essere SUM, COUNT, MAX, MIN, AVG.

Esempio

Considera la seguente tabella degli stipendi.

EmployeeNo Schifoso Deduzione Retribuzione netta
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

Di seguito è riportato un esempio per trovare la somma cumulativa o il totale parziale di NetPay nella tabella Salary. I record vengono ordinati per EmployeeNo e la somma cumulativa viene calcolata nella colonna NetPay.

SELECT  
EmployeeNo, NetPay, 
SUM(Netpay) OVER(ORDER BY EmployeeNo ROWS  
UNBOUNDED PRECEDING) as TotalSalary 
FROM Salary;

Quando la query precedente viene eseguita, produce il seguente output.

EmployeeNo     NetPay     TotalSalary 
-----------  -----------  ----------- 
   101         36000        36000 
   102         74000        110000 
   103         83000        193000 
   104         70000        263000 
   105         18000        281000

RANGO

La funzione RANK ordina i record in base alla colonna fornita. La funzione RANK può anche filtrare il numero di record restituiti in base al rango.

Sintassi

Di seguito è riportata la sintassi generica per utilizzare la funzione RANK.

RANK() OVER 
([PARTITION BY columnnlist] [ORDER BY columnlist][DESC|ASC])

Esempio

Considera la seguente tabella Employee.

EmployeeNo Nome di battesimo Cognome JoinedDate DepartmentID Data di nascita
101 Mike James 27/3/2005 1 1/5/1980
102 Roberto Williams 4/25/2007 2 3/5/1983
103 Peter Paolo 21/03/2007 2 4/1/1983
104 Alex Stuart 2/1/2008 2 11/6/1984
105 Roberto James 1/4/2008 3 12/1/1984

La seguente query ordina i record della tabella dei dipendenti in base alla data di iscrizione e assegna la classifica alla data di iscrizione.

SELECT EmployeeNo, JoinedDate,RANK() 
OVER(ORDER BY JoinedDate) as Seniority 
FROM Employee;

Quando la query precedente viene eseguita, produce il seguente output.

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

La clausola PARTITION BY raggruppa i dati in base alle colonne definite nella clausola PARTITION BY ed esegue la funzione OLAP all'interno di ogni gruppo. Di seguito è riportato un esempio della query che utilizza la clausola PARTITION BY.

SELECT EmployeeNo, JoinedDate,RANK() 
OVER(PARTITION BY DeparmentNo ORDER BY JoinedDate) as Seniority 
FROM Employee;

Quando la query precedente viene eseguita, produce il seguente output. Puoi vedere che il grado viene ripristinato per ogni dipartimento.

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