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

Hvordan Width_Bucket() virker i PostgreSQL

I PostgreSQL, width_bucket() er en matematisk funktion, der tildeler værdier til buckets (individuelle segmenter) i et ækvividde-histogram.

Returtypen er int .

Syntaks

Funktionen kan bruges med en af ​​de tre følgende syntakser:

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)

De to første er grundlæggende ens, bortset fra at de bruger forskellige datatyper (dobbelt præcision vs. numerisk).

Disse tre syntakser er forklaret nedenfor.

width_bucket(operand dp, b1 dp, b2 dp, count int)
Returnerer det bucket-nummer, som operand ville blive tildelt i et histogram, der har tæller ens bredde buckets, der spænder over området b1 til b2; returnerer 0 eller tæl+1 for et input uden for området.
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
Returnerer det bucket-nummer, som operand ville blive tildelt i et histogram, der har tæller ens bredde buckets, der spænder over området b1 til b2; returnerer 0 eller tæl+1 for et input uden for området.
width_bucket(operand anyelement, thresholds anyarray)
Returnerer det bucket-nummer, som operand ville blive tildelt givet en matrix, der viser de nedre grænser for buckets; returnerer 0 for et input, der er mindre end den første nedre grænse; tærskelarrayet skal sorteres, mindste først, ellers vil der blive opnået uventede resultater.

Eksempel – Første/anden syntaks

Som nævnt er de to første syntakser grundlæggende de samme, bortset fra at de skitserer de forskellige datatyper (dobbelt præcision vs. numerisk).

Her er et eksempel for at demonstrere, hvordan de første to syntakser fungerer.

SELECT 
  width_bucket(3, 1, 12, 3),
  width_bucket(5, 1, 12, 3),
  width_bucket(9, 1, 12, 3);

Resultat:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            1 |            2 |            3

Her er en forklaring. Lad os undersøge hvert argument, begyndende fra det sidste og arbejde baglæns til det første.

  • Fjerde argument :Jeg angiver tre spande. Det gør jeg ved at bruge 3 som det fjerde argument.
  • Andet og tredje argument :Jeg angiver, at området er mellem 1 og 12. I dette tilfælde er mit andet argument 1 og tredje argument er 12.
  • Første argument :Denne værdi sammenlignes med det andet og tredje argument for at vide, hvilken af ​​de tre buckets den skal tildeles. I mit eksempel kalder jeg width_bucket() tre gange for at illustrere konceptet bedre. Jeg gør dette, så jeg kan angive tre forskellige værdier som det første argument, som hver er tildelt en anden bucket.

Følgende tabel giver en anden måde at visualisere dette på:

Værdier Spand
1, 2, 3, 4 Spand 1
5, 6, 7, 8 Spand 2
9, 10, 11, 12 Spand 3

Så vi kan se, at den første spand accepterer værdier fra mellem 1 og 4, den anden spand mellem 5 og 8, og den tredje spand er for værdier mellem 9 og 12.

Hvis jeg skulle ændre det, så der var fire buckets, kunne min kode se sådan ud:

SELECT 
  width_bucket(3, 1, 12, 4),
  width_bucket(5, 1, 12, 4),
  width_bucket(9, 1, 12, 4);

Og bordet ville se sådan ud:

Værdier Spand
1, 2, 3 Spand 1
4, 5, 6 Spand 2
7, 8, 9 Spand 3
10, 11, 12 Spand 4

Udenfor rækkevidde

Hvis input er uden for rækkevidden af ​​bucket, får du enten 0 eller count +1, afhængigt af om input er under intervallet eller over det.

Eksempel:

SELECT 
  width_bucket(-3, 1, 12, 3),
  width_bucket(20, 1, 12, 3);

Resultat:

 width_bucket | width_bucket
--------------+--------------
            0 |            4

Eksempel – Tredje syntaks

For at demonstrere den tredje syntaks, lad os tage det første eksempel ovenfor og ændre det til at bruge den tredje syntaks:

SELECT 
  width_bucket(3, array[1, 4, 8]),
  width_bucket(5, array[1, 4, 8]),
  width_bucket(9, array[1, 4, 8]);

Resultat:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            1 |            2 |            3

Her oprettede jeg 3 buckets og tildelte eksplicitte værdier til hver enkelt. I dette tilfælde er de alle lige brede spande, men det er ikke et krav.

En stor fordel ved den tredje syntaks er, at den giver dig mulighed for at skabe spande med ulige bredde.

For eksempel kunne jeg ændre det forrige eksempel til dette:

SELECT 
  width_bucket(3, array[1, 3, 12]),
  width_bucket(5, array[1, 3, 12]),
  width_bucket(9, array[1, 3, 12]);

Resultat:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            2 |            2 |            2

Hvis du gør dette, ændres de spande, som hvert nummer er tildelt. Nu hører alle disse tal i den anden bøtte.

Den tredje syntaks kan være nyttig til en række forskellige brugssager. For eksempel kan du have en række aldersgrupper, der ikke er ligeligt fordelt.

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)";

Resultat:

 Age Group (15) | Age Group (45) | Age Group (50)
----------------+----------------+----------------
              1 |              3 |              4

Udenfor rækkevidde

Funktionen returnerer 0, hvis input er mindre end den første nedre grænse.

Eksempel:

SELECT width_bucket(8, array[10, 40, 30]);

Resultat:

0

Width_Bucket() vs CASE

Eksemplerne på denne side kan også udføres ved hjælp af en CASE udmelding. Forskellen er, at width_bucket() gør det på en mere kortfattet måde.

Her er, hvordan vi kunne omskrive det forrige eksempel ved hjælp af en CASE erklæring.

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;

Resultat:

0

Husk, at input i alle disse eksempler normalt ville være et variabel- eller kolonnenavn snarere end en konstant.


  1. Hvad er MySQL:En oversigt

  2. SQL Server-outputklausul til en skalarvariabel

  3. Kan du opdele/eksplodere et felt i en MySQL-forespørgsel?

  4. Parse json gennem json_table i oracle 18