In PostgreSQL, width_bucket()
è una funzione matematica che assegna valori a bucket (segmenti individuali) in un istogramma di equiampiezza.
Il tipo restituito è int .
Sintassi
La funzione può essere utilizzata con una delle tre seguenti sintassi:
width_bucket(operand dp, b1 dp, b2 dp, count int)
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
width_bucket(operand anyelement, thresholds anyarray)
I primi due sono sostanzialmente gli stessi, tranne per il fatto che utilizzano tipi di dati diversi (doppia precisione vs numerici).
Queste tre sintassi sono spiegate di seguito.
width_bucket(operand dp, b1 dp, b2 dp, count int)
- Restituisce il numero di bucket a cui verrebbe assegnato l'operando in un istogramma con il conteggio di bucket di uguale larghezza che coprono l'intervallo da b1 a b2; restituisce 0 o count+1 per un input al di fuori dell'intervallo.
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
- Restituisce il numero di bucket a cui verrebbe assegnato l'operando in un istogramma con il conteggio di bucket di uguale larghezza che coprono l'intervallo da b1 a b2; restituisce 0 o count+1 per un input al di fuori dell'intervallo.
width_bucket(operand anyelement, thresholds anyarray)
- Restituisce il numero di bucket a cui verrebbe assegnato l'operando dato un array che elenca i limiti inferiori dei bucket; restituisce 0 per un input inferiore al primo limite inferiore; l'array delle soglie deve essere ordinato, prima il più piccolo o si otterranno risultati imprevisti.
Esempio:prima/seconda sintassi
Come accennato, le prime due sintassi sono sostanzialmente le stesse, tranne per il fatto che delineano i diversi tipi di dati (doppia precisione vs numerico).
Ecco un esempio per dimostrare come funzionano le prime due sintassi.
SELECT
width_bucket(3, 1, 12, 3),
width_bucket(5, 1, 12, 3),
width_bucket(9, 1, 12, 3);
Risultato:
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 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),
width_bucket(5, 1, 12, 4),
width_bucket(9, 1, 12, 4);
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 |
Fuori portata
Se l'input è al di fuori dell'intervallo del bucket, otterrai 0 o count +1, a seconda che l'input sia al di sotto dell'intervallo o al di sopra di esso.
Esempio:
SELECT
width_bucket(-3, 1, 12, 3),
width_bucket(20, 1, 12, 3);
Risultato:
width_bucket | width_bucket --------------+-------------- 0 | 4
Esempio:terza sintassi
Per dimostrare la terza sintassi, prendiamo il primo esempio sopra e modifichiamolo per utilizzare la terza sintassi:
SELECT
width_bucket(3, array[1, 4, 8]),
width_bucket(5, array[1, 4, 8]),
width_bucket(9, array[1, 4, 8]);
Risultato:
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 1 | 2 | 3
Qui ho creato 3 bucket e assegnato valori espliciti a ciascuno. In questo caso sono tutti bucket di uguale larghezza, ma non è un requisito.
Uno dei principali vantaggi della terza sintassi è che ti consente di creare bucket di larghezza diversa.
Ad esempio, potrei modificare l'esempio precedente in questo:
SELECT
width_bucket(3, array[1, 3, 12]),
width_bucket(5, array[1, 3, 12]),
width_bucket(9, array[1, 3, 12]);
Risultato:
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 2 | 2 | 2
In questo modo vengono modificati i bucket a cui è assegnato ciascun numero. Ora, tutti quei numeri appartengono al secondo secchio.
La terza sintassi potrebbe essere utile per una varietà di casi d'uso. Ad esempio, potresti avere una fascia di età non equamente distribuita.
SELECT
width_bucket(15, array[10, 18, 30, 50, 65]) AS "Age Group (15)",
width_bucket(45, array[10, 18, 30, 50, 65]) AS "Age Group (45)",
width_bucket(50, array[10, 18, 30, 50, 65]) AS "Age Group (50)";
Risultato:
Age Group (15) | Age Group (45) | Age Group (50) ----------------+----------------+---------------- 1 | 3 | 4
Fuori portata
La funzione restituisce 0 se l'input è minore del primo limite inferiore.
Esempio:
SELECT width_bucket(8, array[10, 40, 30]);
Risultato:
0
Width_Bucket() vs CASE
Gli esempi in questa pagina possono essere eseguiti anche utilizzando un CASE
dichiarazione. La differenza è che width_bucket()
lo fa in modo più conciso.
Ecco come potremmo riscrivere l'esempio precedente usando un CASE
dichiarazione.
SELECT
CASE
WHEN 8 BETWEEN 0 AND 9 THEN 0
WHEN 8 BETWEEN 10 AND 39 THEN 1
WHEN 8 BETWEEN 40 AND 49 THEN 2
ELSE 3
END;
Risultato:
0
Tieni presente che l'input in tutti questi esempi sarebbe normalmente un nome di variabile o colonna anziché una costante.