I Oracle er WIDTH_BUCKET()
funktionen giver dig mulighed for at konstruere ligebredde histogrammer, hvor histogramområdet er opdelt i intervaller, der har identisk størrelse.
For et givet udtryk, WIDTH_BUCKET()
returnerer det bucket-nummer, som værdien af dette udtryk ville falde ind i efter at være blevet evalueret.
Syntaks
Syntaksen ser sådan ud:
WIDTH_BUCKET(expr, min_value, max_value, num_buckets)
Hvor:
expr
er det udtryk, som histogrammet oprettes for. Dette udtryk skal evalueres til en numerisk eller datetime-værdi eller til en værdi, der implicit kan konverteres til en numerisk eller datetime-værdi. Hvisexpr
evalueres tilnull
, så returnerer udtrykketnull
.min_value
ogmax_value
er udtryk, der løses til slutpunkterne i det acceptable interval forexpr
. Begge disse udtryk skal også evalueres til numeriske eller datetime-værdier, og ingen af disse kan evalueres tilnull
.num_buckets
er et udtryk, der går over til en konstant, der angiver antallet af spande. Dette udtryk skal evalueres til et positivt heltal.
Eksempel
Her er et eksempel for at vise, hvordan det virker.
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;
Resultat:
R1 R2 R3 _____ _____ _____ 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 er12
. - 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) AS r1,
WIDTH_BUCKET(5, 1, 12, 4) AS r2,
WIDTH_BUCKET(9, 1, 12, 4) AS r3
FROM DUAL;
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 |
Her er et andet eksempel, hvor kun spandstørrelserne ændres:
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;
Resultat:
R1 R2 R3 _____ _____ _____ 2 3 4
Udenfor rækkevidde
Hvis input er uden for rækkevidden af bøtten, får du enten 0
eller num_buckets
+1, afhængig af om input er under intervallet eller over det. I sådanne tilfælde opretter Oracle Database en underflow-bucket nummereret 0
og en overløbsspand nummereret num_buckets
+1.
Eksempel:
SELECT
WIDTH_BUCKET(-3, 1, 12, 3),
WIDTH_BUCKET(20, 1, 12, 3)
FROM DUAL;
Resultat:
WIDTH_BUCKET(-3,1,12,3) WIDTH_BUCKET(20,1,12,3) __________________________ __________________________ 0 4