In Oracle, de WIDTH_BUCKET()
Met deze functie kunt u histogrammen van gelijke breedte maken, waarin het histogrambereik is verdeeld in intervallen van gelijke grootte.
Voor een bepaalde uitdrukking, WIDTH_BUCKET()
geeft het bucketnummer terug waarin de waarde van deze uitdrukking zou vallen na te zijn geëvalueerd.
Syntaxis
De syntaxis gaat als volgt:
WIDTH_BUCKET(expr, min_value, max_value, num_buckets)
Waar:
expr
is de uitdrukking waarvoor het histogram wordt gemaakt. Deze expressie moet resulteren in een numerieke of datetime-waarde of in een waarde die impliciet kan worden geconverteerd naar een numerieke of datetime-waarde. Alsexpr
evalueert totnull
, dan retourneert de uitdrukkingnull
.min_value
enmax_value
zijn uitdrukkingen die oplossen naar de eindpunten van het acceptabele bereik voorexpr
. Beide expressies moeten ook worden geëvalueerd naar numerieke of datetime-waarden, en geen van beide kan worden geëvalueerd totnull
.num_buckets
is een uitdrukking die wordt omgezet in een constante die het aantal buckets aangeeft. Deze uitdrukking moet een positief geheel getal opleveren.
Voorbeeld
Hier is een voorbeeld om te laten zien hoe het werkt.
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;
Resultaat:
R1 R2 R3 _____ _____ _____ 1 2 3
Hier is een uitleg. Laten we elk argument eens bekijken, beginnend bij het laatste en terugwerkend naar het eerste.
- Vierde argument :Ik specificeer drie emmers. Ik doe dit door
3
. te gebruiken als het vierde argument. - Tweede en derde argument :Ik specificeer dat het bereik tussen 1 en 12 ligt. In dit geval is mijn tweede argument
1
en derde argument is12
. - Eerste argument :Deze waarde wordt vergeleken met het tweede en derde argument, om te weten aan welke van de drie buckets het moet worden toegewezen. In mijn voorbeeld noem ik
WIDTH_BUCKET()
drie keer om het concept beter te illustreren. Ik doe dit zodat ik drie verschillende waarden als eerste argument kan opgeven, die elk aan een andere bucket worden toegewezen.
De volgende tabel biedt een andere manier om dit te visualiseren:
Waarden | Emmer |
---|---|
1, 2, 3, 4 | Emmer 1 |
5, 6, 7, 8 | Emmer 2 |
9, 10, 11, 12 | Emmer 3 |
We kunnen dus zien dat de eerste bucket waarden tussen 1 en 4 accepteert, de tweede bucket tussen 5 en 8, en de derde bucket is voor waarden tussen 9 en 12.
Als ik het zou veranderen zodat er vier buckets zijn, zou mijn code er ongeveer zo uit kunnen zien:
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;
En de tabel zou er als volgt uitzien:
Waarden | Emmer |
---|---|
1, 2, 3 | Emmer 1 |
4, 5, 6 | Emmer 2 |
7, 8, 9 | Emmer 3 |
10, 11, 12 | Emmer 4 |
Hier is nog een voorbeeld waarin alleen de afmetingen van de emmers veranderen:
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;
Resultaat:
R1 R2 R3 _____ _____ _____ 2 3 4
Buiten bereik
Als de invoer buiten het bereik van de bucket valt, krijgt u ofwel 0
of num_buckets
+1, afhankelijk van of de invoer onder of boven het bereik ligt. In dergelijke gevallen creëert Oracle Database een underflow-bucket met het nummer 0
en een overloop-emmer met het nummer num_buckets
+1.
Voorbeeld:
SELECT
WIDTH_BUCKET(-3, 1, 12, 3),
WIDTH_BUCKET(20, 1, 12, 3)
FROM DUAL;
Resultaat:
WIDTH_BUCKET(-3,1,12,3) WIDTH_BUCKET(20,1,12,3) __________________________ __________________________ 0 4