I Oracle, WIDTH_BUCKET()
Med funktionen kan du konstruera ekvibreddshistogram, där histogramintervallet är uppdelat i intervall som har identisk storlek.
För ett givet uttryck, WIDTH_BUCKET()
returnerar bucket-numret som värdet av detta uttryck skulle hamna i efter att ha utvärderats.
Syntax
Syntaxen ser ut så här:
WIDTH_BUCKET(expr, min_value, max_value, num_buckets)
Var:
expr
är uttrycket för vilket histogrammet skapas. Det här uttrycket måste utvärderas till ett numeriskt värde eller datetime-värde eller till ett värde som implicit kan konverteras till ett numeriskt eller datetime-värde. Omexpr
utvärderas tillnull
, då returnerar uttrycketnull
.min_value
ochmax_value
är uttryck som löser sig till slutpunkterna för det acceptabla intervallet förexpr
. Båda dessa uttryck måste också utvärderas till numeriska eller datetime-värden, och inget av dessa kan utvärderas tillnull
.num_buckets
är ett uttryck som löser sig till en konstant som anger antalet hinkar. Detta uttryck måste utvärderas till ett positivt heltal.
Exempel
Här är ett exempel för att visa hur det fungerar.
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
Här är en förklaring. Låt oss undersöka varje argument, börja från det sista och arbeta bakåt till det första.
- Fjärde argumentet :Jag anger tre hinkar. Jag gör detta genom att använda
3
som det fjärde argumentet. - Andra och tredje argument :Jag anger att intervallet är mellan 1 och 12. I det här fallet är mitt andra argument
1
och det tredje argumentet är12
. - Första argumentet :Detta värde jämförs med det andra och tredje argumentet för att veta vilken av de tre hinkarna det ska tilldelas. I mitt exempel anropar jag
WIDTH_BUCKET()
tre gånger för att illustrera konceptet bättre. Jag gör detta så att jag kan ange tre olika värden som det första argumentet, som vart och ett är tilldelat en annan hink.
Följande tabell ger ett annat sätt att visualisera detta:
Värden | Hink |
---|---|
1, 2, 3, 4 | Hink 1 |
5, 6, 7, 8 | Hink 2 |
9, 10, 11, 12 | Hink 3 |
Så vi kan se att den första hinken accepterar värden mellan 1 och 4, den andra hinken mellan 5 och 8, och den tredje hinken är för värden mellan 9 och 12.
Om jag skulle ändra det så att det fanns fyra hinkar, kan min kod se ut ungefär så här:
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;
Och tabellen skulle se ut så här:
Värden | Hink |
---|---|
1, 2, 3 | Hink 1 |
4, 5, 6 | Hink 2 |
7, 8, 9 | Hink 3 |
10, 11, 12 | Hink 4 |
Här är ett annat exempel där endast skopstorlekarna ändras:
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
Utanför räckvidd
Om inmatningen ligger utanför intervallet för hinken får du antingen 0
eller num_buckets
+1, beroende på om ingången är under intervallet eller över det. I sådana fall skapar Oracle Database en underflödeshink numrerad 0
och en overflow-hink numrerad num_buckets
+1.
Exempel:
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