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.