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ù :
exprest 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_valueetmax_valuesont 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_bucketsest 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
3comme 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
1et 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