In Oracle, il WIDTH_BUCKET()
La funzione consente di costruire istogrammi di equiampiezza, in cui l'intervallo dell'istogramma è suddiviso in intervalli di dimensioni identiche.
Per una determinata espressione, WIDTH_BUCKET()
restituisce il numero di bucket in cui rientrerebbe il valore di questa espressione dopo essere stata valutata.
Sintassi
La sintassi è questa:
WIDTH_BUCKET(expr, min_value, max_value, num_buckets)
Dove:
expr
è l'espressione per la quale viene creato l'istogramma. Questa espressione deve restituire un valore numerico o datetime oppure un valore che può essere convertito in modo implicito in un valore numerico o datetime. Seexpr
restituiscenull
, quindi l'espressione restituiscenull
.min_value
emax_value
sono espressioni che si risolvono ai punti finali dell'intervallo accettabile perexpr
. Entrambe queste espressioni devono anche restituire valori numerici o datetime e nessuna delle due può restituirenull
.num_buckets
è un'espressione che si risolve in una costante che indica il numero di bucket. Questa espressione deve restituire un numero intero positivo.
Esempio
Ecco un esempio per dimostrare come funziona.
SELECT
WIDTH_BUCKET(3, 1, 12, 3) AS r1,
WIDTH_BUCKET(5, 1, 12, 3) AS r2,
WIDTH_BUCKET(9, 1, 12, 3) AS r3
FROM DUAL;
Risultato:
R1 R2 R3 _____ _____ _____ 1 2 3
Ecco una spiegazione. Esaminiamo ogni argomento, partendo dall'ultimo e procedendo a ritroso fino al primo.
- Quarto argomento :Specifico tre bucket. Lo faccio usando
3
come quarto argomento. - Secondo e terzo argomento :Specifico che l'intervallo è compreso tra 1 e 12. In questo caso il mio secondo argomento è
1
e il terzo argomento è12
. - Primo argomento :questo valore viene confrontato con il secondo e il terzo argomento, in modo da sapere a quale dei tre bucket deve essere assegnato. Nel mio esempio chiamo
WIDTH_BUCKET()
tre volte per illustrare meglio il concetto. Lo faccio in modo da poter fornire tre valori diversi come primo argomento, ognuno dei quali è assegnato a un bucket diverso.
La tabella seguente fornisce un altro modo per visualizzarlo:
Valori | Secchio |
---|---|
1, 2, 3, 4 | Secchio 1 |
5, 6, 7, 8 | Secchio 2 |
9, 10, 11, 12 | Secchio 3 |
Quindi possiamo vedere che il primo bucket accetta valori compresi tra 1 e 4, il secondo bucket tra 5 e 8 e il terzo bucket è per valori compresi tra 9 e 12.
Se dovessi cambiarlo in modo che ci fossero quattro bucket, il mio codice potrebbe assomigliare a questo:
SELECT
WIDTH_BUCKET(3, 1, 12, 4) AS r1,
WIDTH_BUCKET(5, 1, 12, 4) AS r2,
WIDTH_BUCKET(9, 1, 12, 4) AS r3
FROM DUAL;
E la tabella sarebbe simile a questa:
Valori | Secchio |
---|---|
1, 2, 3 | Secchio 1 |
4, 5, 6 | Secchio 2 |
7, 8, 9 | Secchio 3 |
10, 11, 12 | Secchio 4 |
Ecco un altro esempio in cui cambiano solo le dimensioni del secchio:
SELECT
WIDTH_BUCKET(5, 1, 12, 3) AS r1,
WIDTH_BUCKET(5, 1, 12, 6) AS r2,
WIDTH_BUCKET(5, 1, 12, 10) AS r3
FROM DUAL;
Risultato:
R1 R2 R3 _____ _____ _____ 2 3 4
Fuori portata
Se l'input è al di fuori dell'intervallo del bucket, otterrai 0
o num_buckets
+1, a seconda che l'ingresso sia al di sotto dell'intervallo o al di sopra di esso. In questi casi, Oracle Database crea un bucket di underflow numerato 0
e un bucket di overflow numerato num_buckets
+1.
Esempio:
SELECT
WIDTH_BUCKET(-3, 1, 12, 3),
WIDTH_BUCKET(20, 1, 12, 3)
FROM DUAL;
Risultato:
WIDTH_BUCKET(-3,1,12,3) WIDTH_BUCKET(20,1,12,3) __________________________ __________________________ 0 4