sql >> Database teknologi >  >> RDS >> Oracle

WIDTH_BUCKET() Funktion i Oracle

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. Hvis expr evalueres til null , så returnerer udtrykket null .
  • min_value og max_value er udtryk, der løses til slutpunkterne i det acceptable interval for expr . Begge disse udtryk skal også evalueres til numeriske eller datetime-værdier, og ingen af ​​disse kan evalueres til null .
  • 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 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) 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 

  1. Hvordan RandomBlob() virker i SQLite

  2. Sjovt med (columnstore) komprimering på et meget stort bord – del 3

  3. Hvornår spoler SQL Server-sortering tilbage?

  4. Konvertering mislykkedes ved konvertering af dato og/eller klokkeslæt fra tegnstreng, mens dato og klokkeslæt blev indsat