PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come funziona Width_Bucket() in PostgreSQL

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.