Sintassi della famiglia di insiemi ipotetici
La sintassi dell'ipotetica famiglia di insiemi è la seguente:
SELECT fn(<exprlist>)
WITHIN GROUP ( ORDER BY <value_expression> [asc|desc] [nulls {first |
last}] [,...])) FROM <from_expr>[GROUP BY <group_expr>]
Queste funzioni sono chiamate funzioni di insiemi ipotetici. Prendono un argomento e un'espressione d'ordine. L'espressione order viene valutata per produrre un insieme ordinato di valori. L'elenco degli argomenti produce una riga R, che è un'ipotetica riga di questa collezione ordinata.
- dense_rank
- Restituisce il rango denso di un'ipotetica riga all'interno di un gruppo di righe. I ranghi sono numeri interi consecutivi che iniziano con uno. Il numero di argomenti è uguale al numero di espressioni nella clausola ORDER BY di WITHIN GROUP. Gli argomenti di 'dense_rank vengono trattati come se fossero dello stesso tipo di dati (il casting necessario avviene automaticamente) di quello della corrispondente espressione order-by di WITHIN GROUP.
- rank
- Calcola il rango di un'ipotetica riga all'interno di un gruppo di valori. Le righe con valori uguali per i criteri di classificazione ricevono lo stesso rango.
- percent_rank
- Calcola il grado percentuale (0 - 1) di un'ipotetica riga all'interno di un gruppo di valori. Restituisce il rango percentuale della riga R se fosse un'ipotetica riga del gruppo aggregante (il rango della riga R-1, diviso per il numero di righe della collezione aumentata).
- cume_dist
- Calcola la distribuzione cumulativa di un'ipotetica riga all'interno di un gruppo di valori. Restituisce il 'cume_dist di R se si tratta di un'ipotetica riga del gruppo aggregante (il numero di righe precedenti o uguali a R, diviso per il numero di righe del gruppo aggregante).
L'espressione/sottoespressione dell'argomento deve corrispondere esattamente all'espressione GROUP BY. L'esempio seguente non è esatto e restituisce un errore:
SELECT dense_rank(b+a) WITHIN GROUP( order by col) FROM T GROUP BY a+b; L'espressione corretta sarebbe la seguente:
SELECT dense_rank(a+b) WITHIN GROUP( order by col) FROM T GROUP BY a+b;L'esempio seguente non è esatto e restituisce un errore:
SELECT dense_rank(a+b+c) WITHIN GROUP(order by col) FROM T GROUP BY a,
b+c;L'espressione corretta sarebbe la seguente:
SELECT dense_rank(a+(b+c)) WITHIN GROUP(order by col) FROM T GROUP BY
a, b+c;