sql >> Databasteknik >  >> RDS >> Oracle

WIDTH_BUCKET() Funktion i Oracle

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. Om expr utvärderas till null , då returnerar uttrycket null .
  • min_value och max_value är uttryck som löser sig till slutpunkterna för det acceptabla intervallet för expr . Båda dessa uttryck måste också utvärderas till numeriska eller datetime-värden, och inget av dessa kan utvärderas till null .
  • 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 är 12 .
  • 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 

  1. TSQL - Hur använder man GO inuti ett BEGIN .. END-block?

  2. Importera från och exportera till filer med MySQL-kommandoraden

  3. Hur serialiserar jag en stor graf av .NET-objekt till en SQL Server BLOB utan att skapa en stor buffert?

  4. Skicka flera uppsättningar eller matriser av värden till en funktion