sql >> Database >  >> RDS >> Oracle

WIDTH_BUCKET() Functie in Oracle

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. Als expr evalueert tot null , dan retourneert de uitdrukking null .
  • min_value en max_value zijn uitdrukkingen die oplossen naar de eindpunten van het acceptabele bereik voor expr . Beide expressies moeten ook worden geëvalueerd naar numerieke of datetime-waarden, en geen van beide kan worden geëvalueerd tot null .
  • 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 is 12 .
  • 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 

  1. Wat betekent %Type in Oracle sql?

  2. Opgeslagen procedure uitvoeren vanuit een functie

  3. C#-geparametriseerde queries voor Oracle - serieuze en gevaarlijke bug!

  4. Full-Text Search implementeren in SQL Server 2016 voor geavanceerde gebruikers