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. Siexpr
évalue ànull
, alors l'expression renvoienull
.min_value
etmax_value
sont des expressions qui se résolvent aux extrémités de la plage acceptable pourexpr
. 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 est12
. - 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