Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fonction WIDTH_BUCKET() dans Oracle

Dans Oracle, le WIDTH_BUCKET() permet de construire des histogrammes équilargeurs, dans lesquels la plage d'histogrammes est divisée en intervalles de taille identique.

Pour une expression donnée, WIDTH_BUCKET() renvoie le numéro de compartiment dans lequel la valeur de cette expression tomberait après avoir été évaluée.

Syntaxe

La syntaxe ressemble à ceci :

WIDTH_BUCKET(expr, min_value, max_value, num_buckets)

Où :

  • expr est l'expression pour laquelle l'histogramme est créé. Cette expression doit correspondre à une valeur numérique ou date/heure ou à une valeur pouvant être implicitement convertie en valeur numérique ou date/heure. Si expr évalue à null , alors l'expression renvoie null .
  • min_value et max_value sont des expressions qui se résolvent aux extrémités de la plage acceptable pour expr . Ces deux expressions doivent également être évaluées à des valeurs numériques ou datetime, et aucune ne peut être évaluée à null .
  • num_buckets est une expression qui se résout en une constante indiquant le nombre de compartiments. Cette expression doit correspondre à un entier positif.

Exemple

Voici un exemple pour montrer comment cela fonctionne.

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;

Résultat :

   R1    R2    R3 
_____ _____ _____ 
    1     2     3 

Voici une explication. Examinons chaque argument, en commençant par le dernier et en remontant jusqu'au premier.

  • Quatrième argument :Je spécifie trois seaux. Je le fais en utilisant 3 comme quatrième argument.
  • Deuxième et troisième arguments :Je précise que la plage est comprise entre 1 et 12. Dans ce cas, mon deuxième argument est 1 et le troisième argument est 12 .
  • Premier argument :Cette valeur est comparée aux deuxième et troisième arguments, afin de savoir auquel des trois buckets elle doit être affectée. Dans mon exemple, j'appelle WIDTH_BUCKET() trois fois afin de mieux illustrer le concept. Je fais cela pour pouvoir fournir trois valeurs différentes comme premier argument, chacune étant affectée à un compartiment différent.

Le tableau suivant fournit une autre façon de visualiser cela :

Valeurs Compartiment
1, 2, 3, 4 Compartiment 1
5, 6, 7, 8 Compartiment 2
9, 10, 11, 12 Groupe 3

Nous pouvons donc voir que le premier seau accepte les valeurs comprises entre 1 et 4, le deuxième seau entre 5 et 8 et le troisième seau pour les valeurs comprises entre 9 et 12.

Si je devais le changer pour qu'il y ait quatre buckets, mon code pourrait ressembler à ceci :

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;

Et le tableau ressemblerait à ceci :

Valeurs Compartiment
1, 2, 3 Compartiment 1
4, 5, 6 Compartiment 2
7, 8, 9 Groupe 3
10, 11, 12 Groupe 4

Voici un autre exemple dans lequel seules les tailles de compartiment changent :

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;

Résultat :

   R1    R2    R3 
_____ _____ _____ 
    2     3     4 

Hors de portée

Si l'entrée est en dehors de la plage du compartiment, vous obtiendrez soit 0 ou num_buckets +1, selon que l'entrée est en dessous ou au-dessus de la plage. Dans de tels cas, Oracle Database crée un compartiment de dépassement inférieur numéroté 0 et un compartiment de débordement numéroté num_buckets +1.

Exemple :

SELECT 
  WIDTH_BUCKET(-3, 1, 12, 3),
  WIDTH_BUCKET(20, 1, 12, 3)
FROM DUAL;

Résultat :

   WIDTH_BUCKET(-3,1,12,3)    WIDTH_BUCKET(20,1,12,3) 
__________________________ __________________________ 
                         0                          4