SQL
Funzioni (analitico)
Ricerca…
introduzione
Si utilizzano le funzioni analitiche per determinare i valori in base a gruppi di valori. Ad esempio, è possibile utilizzare questo tipo di funzione per determinare totali parziali, percentuali o il risultato migliore all'interno di un gruppo.
Sintassi
- FIRST_VALUE (scalar_expression) OVER ([partition_by_clause] order_by_clause [rows_range_clause])
- LAST_VALUE (scalar_expression) OVER ([partition_by_clause] order_by_clause [rows_range_clause])
- LAG (scalar_expression [, offset] [, default]) OVER ([partition_by_clause] order_by_clause)
- LEAD (scalar_expression [, offset], [default]) OVER ([partition_by_clause] order_by_clause)
- PERCENT_RANK () OVER ([partition_by_clause] order_by_clause)
- CUME_DIST () OVER ([partition_by_clause] order_by_clause)
- PERCENTILE_DISC (numeric_literal) WITHIN GROUP (ORDER BY order_by_expression [ASC | DESC]) OVER ([<partition_by_clause>])
- PERCENTILE_CONT (numeric_literal) WITHIN GROUP (ORDER BY order_by_expression [ASC | DESC]) OVER ([<partition_by_clause>])
FIRST_VALUE
Si utilizza la funzione FIRST_VALUE
per determinare il primo valore in un set di risultati ordinato, che si identifica utilizzando un'espressione scalare.
SELECT StateProvinceID, Name, TaxRate,
FIRST_VALUE(StateProvinceID)
OVER(ORDER BY TaxRate ASC) AS FirstValue
FROM SalesTaxRate;
In questo esempio, la funzione FIRST_VALUE
viene utilizzata per restituire l' ID
dello stato o della provincia con l'aliquota d'imposta più bassa. La clausola OVER
viene utilizzata per ordinare le aliquote fiscali per ottenere il tasso più basso.
StateProvinceID | Nome | Aliquota fiscale | FirstValue |
---|---|---|---|
74 | Tassa di vendita dello stato dell'Utah | 5.00 | 74 |
36 | Imposta sul reddito dello stato del Minnesota | 6.75 | 74 |
30 | Imposta sulle vendite dello stato del Massachusetts | 7.00 | 74 |
1 | GST canadese | 7.00 | 74 |
57 | GST canadese | 7.00 | 74 |
63 | GST canadese | 7.00 | 74 |
LAST_VALUE
La funzione LAST_VALUE
fornisce l'ultimo valore in un set di risultati ordinato, che si specifica utilizzando un'espressione scalare.
SELECT TerritoryID, StartDate, BusinessentityID,
LAST_VALUE(BusinessentityID)
OVER(ORDER BY TerritoryID) AS LastValue
FROM SalesTerritoryHistory;
Questo esempio utilizza la funzione LAST_VALUE
per restituire l'ultimo valore per ogni set di righe nei valori ordinati.
TerritoryID | Data d'inizio | BusinessEntityID | LastValue |
---|---|---|---|
1 | 2005-07-01 00.00.00.000 | 280 | 283 |
1 | 2006-11-01 00.00.00.000 | 284 | 283 |
1 | 2005-07-01 00.00.00.000 | 283 | 283 |
2 | 2007-01-01 00.00.00.000 | 277 | 275 |
2 | 2005-07-01 00.00.00.000 | 275 | 275 |
3 | 2007-01-01 00.00.00.000 | 275 | 277 |
GAL e LEAD
La funzione LAG
fornisce i dati sulle righe prima della riga corrente nello stesso set di risultati. Ad esempio, in un'istruzione SELECT
, è possibile confrontare i valori nella riga corrente con i valori di una riga precedente.
Si utilizza un'espressione scalare per specificare i valori da confrontare. Il parametro offset è il numero di righe prima della riga corrente che verrà utilizzata nel confronto. Se non si specifica il numero di righe, viene utilizzato il valore predefinito di una riga.
Il parametro predefinito specifica il valore che deve essere restituito quando l'espressione all'offset ha un valore NULL
. Se non si specifica un valore, viene restituito un valore di NULL
.
La funzione LEAD
fornisce i dati sulle righe dopo la riga corrente nel set di righe. Ad esempio, in un'istruzione SELECT
, è possibile confrontare i valori nella riga corrente con i valori nella seguente riga.
Specificare i valori che dovrebbero essere confrontati utilizzando un'espressione scalare. Il parametro offset è il numero di righe dopo la riga corrente che verrà utilizzata nel confronto.
Specificare il valore che deve essere restituito quando l'espressione all'offset ha un valore NULL
utilizzando il parametro predefinito. Se non si specificano questi parametri, viene utilizzato il valore predefinito di una riga e viene restituito un valore di NULL
.
SELECT BusinessEntityID, SalesYTD,
LEAD(SalesYTD, 1, 0) OVER(ORDER BY BusinessEntityID) AS "Lead value",
LAG(SalesYTD, 1, 0) OVER(ORDER BY BusinessEntityID) AS "Lag value"
FROM SalesPerson;
Questo esempio utilizza le funzioni LEAD e LAG per confrontare i valori di vendita di ciascun dipendente con quelli degli impiegati elencati sopra e sotto, con i record ordinati in base alla colonna BusinessEntityID.
BusinessEntityID | SalesYTD | Valore guida | Valore di ritardo |
---|---|---|---|
274 | 559697.5639 | 3763178.1787 | 0.0000 |
275 | 3763178.1787 | 4251368.5497 | 559697.5639 |
276 | 4251368.5497 | 3189418.3662 | 3763178.1787 |
277 | 3189418.3662 | 1453719.4653 | 4251368.5497 |
278 | 1453719.4653 | 2315185.6110 | 3189418.3662 |
279 | 2315185.6110 | 1352577.1325 | 1453719.4653 |
PERCENT_RANK e CUME_DIST
La funzione PERCENT_RANK
calcola la classifica di una riga relativa al set di righe. La percentuale si basa sul numero di righe nel gruppo che hanno un valore inferiore rispetto alla riga corrente.
Il primo valore nel set di risultati ha sempre una percentuale di zero. Il valore per il valore più alto o ultimo del set è sempre uno.
La funzione CUME_DIST
calcola la posizione relativa di un valore specificato in un gruppo di valori, determinando la percentuale di valori inferiore o uguale a quel valore. Questa è chiamata la distribuzione cumulativa.
SELECT BusinessEntityID, JobTitle, SickLeaveHours,
PERCENT_RANK() OVER(PARTITION BY JobTitle ORDER BY SickLeaveHours DESC)
AS "Percent Rank",
CUME_DIST() OVER(PARTITION BY JobTitle ORDER BY SickLeaveHours DESC)
AS "Cumulative Distribution"
FROM Employee;
In questo esempio, si utilizza una clausola ORDER
per partizionare - o raggruppare - le righe recuperate SELECT
base ai titoli di lavoro dei dipendenti, con i risultati in ogni gruppo ordinati in base al numero di ore di congedo per malattia che i dipendenti hanno utilizzato.
BusinessEntityID | Titolo di lavoro | SickLeaveHours | Classifica percentuale | Distribuzione cumulativa |
---|---|---|---|---|
267 | Specialista dell'applicazione | 57 | 0 | 0.25 |
268 | Specialista dell'applicazione | 56 | 0,333333333333333 | 0.75 |
269 | Specialista dell'applicazione | 56 | 0,333333333333333 | 0.75 |
272 | Specialista dell'applicazione | 55 | 1 | 1 |
262 | Assitant al funzionario finanziario di Cheif | 48 | 0 | 1 |
239 | Specialista dei vantaggi | 45 | 0 | 1 |
252 | Acquirente | 50 | 0 | 0,111111111111111 |
251 | Acquirente | 49 | 0,125 | 0,333333333333333 |
256 | Acquirente | 49 | 0,125 | 0,333333333333333 |
253 | Acquirente | 48 | 0.375 | 0,555555555555555 |
254 | Acquirente | 48 | 0.375 | 0,555555555555555 |
La funzione PERCENT_RANK
classifica le voci all'interno di ciascun gruppo. Per ciascuna voce, restituisce la percentuale di voci nello stesso gruppo con valori inferiori.
La funzione CUME_DIST
è simile, tranne che restituisce la percentuale di valori inferiore o uguale al valore corrente.
PERCENTILE_DISC e PERCENTILE_CONT
La funzione PERCENTILE_DISC
elenca il valore della prima voce in cui la distribuzione cumulativa è superiore al percentile fornito utilizzando il parametro numeric_literal
.
I valori sono raggruppati per set di righe o partizioni, come specificato dalla clausola WITHIN GROUP
.
La funzione PERCENTILE_CONT
è simile alla funzione PERCENTILE_DISC
, ma restituisce la media della somma della prima voce corrispondente e della voce successiva.
SELECT BusinessEntityID, JobTitle, SickLeaveHours,
CUME_DIST() OVER(PARTITION BY JobTitle ORDER BY SickLeaveHours ASC)
AS "Cumulative Distribution",
PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY SickLeaveHours)
OVER(PARTITION BY JobTitle) AS "Percentile Discreet"
FROM Employee;
Per trovare il valore esatto dalla riga che corrisponde o supera lo 0,5 percentile, si passa il percentile come valore letterale numerico nella funzione PERCENTILE_DISC
. La colonna Percentile Discreta in un set di risultati elenca il valore della riga in cui la distribuzione cumulativa è superiore al percentile specificato.
BusinessEntityID | Titolo di lavoro | SickLeaveHours | Distribuzione cumulativa | Percentile discreto |
---|---|---|---|---|
272 | Specialista dell'applicazione | 55 | 0.25 | 56 |
268 | Specialista dell'applicazione | 56 | 0.75 | 56 |
269 | Specialista dell'applicazione | 56 | 0.75 | 56 |
267 | Specialista dell'applicazione | 57 | 1 | 56 |
Per basare il calcolo su un set di valori, si utilizza la funzione PERCENTILE_CONT
. La colonna "Percentile continuo" nei risultati elenca il valore medio della somma del valore del risultato e il successivo valore di corrispondenza più alto.
SELECT BusinessEntityID, JobTitle, SickLeaveHours,
CUME_DIST() OVER(PARTITION BY JobTitle ORDER BY SickLeaveHours ASC)
AS "Cumulative Distribution",
PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY SickLeaveHours)
OVER(PARTITION BY JobTitle) AS "Percentile Discreet",
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY SickLeaveHours)
OVER(PARTITION BY JobTitle) AS "Percentile Continuous"
FROM Employee;
BusinessEntityID | Titolo di lavoro | SickLeaveHours | Distribuzione cumulativa | Percentile discreto | Percentile continuo |
---|---|---|---|---|---|
272 | Specialista dell'applicazione | 55 | 0.25 | 56 | 56 |
268 | Specialista dell'applicazione | 56 | 0.75 | 56 | 56 |
269 | Specialista dell'applicazione | 56 | 0.75 | 56 | 56 |
267 | Specialista dell'applicazione | 57 | 1 | 56 | 56 |