Dans PostgreSQL, width_bucket()
est une fonction mathématique qui attribue des valeurs à des compartiments (segments individuels) dans un histogramme équilargeur.
Le type de retour est int .
Syntaxe
La fonction peut être utilisée avec l'une des trois syntaxes suivantes :
width_bucket(operand dp, b1 dp, b2 dp, count int)
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
width_bucket(operand anyelement, thresholds anyarray)
Les deux premiers sont fondamentalement les mêmes, sauf qu'ils utilisent des types de données différents (double précision vs numérique).
Ces trois syntaxes sont expliquées ci-dessous.
width_bucket(operand dp, b1 dp, b2 dp, count int)
- Renvoie le numéro de compartiment auquel l'opérande serait affecté dans un histogramme ayant un nombre de compartiments de largeur égale couvrant la plage b1 à b2 ; renvoie 0 ou count+1 pour une entrée en dehors de la plage.
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
- Renvoie le numéro de compartiment auquel l'opérande serait affecté dans un histogramme ayant un nombre de compartiments de largeur égale couvrant la plage b1 à b2 ; renvoie 0 ou count+1 pour une entrée en dehors de la plage.
width_bucket(operand anyelement, thresholds anyarray)
- Renvoie le numéro de bucket auquel l'opérande serait affecté étant donné un tableau listant les limites inférieures des buckets ; renvoie 0 pour une entrée inférieure à la première borne inférieure ; le tableau des seuils doit être trié, le plus petit en premier, sinon des résultats inattendus seront obtenus.
Exemple :première/seconde syntaxe
Comme mentionné, les deux premières syntaxes sont fondamentalement les mêmes, sauf qu'elles décrivent les différents types de données (double précision vs numérique).
Voici un exemple pour montrer comment fonctionnent les deux premières syntaxes.
SELECT
width_bucket(3, 1, 12, 3),
width_bucket(5, 1, 12, 3),
width_bucket(9, 1, 12, 3);
Résultat :
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 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),
width_bucket(5, 1, 12, 4),
width_bucket(9, 1, 12, 4);
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 |
Hors de portée
Si l'entrée est en dehors de la plage du bucket, vous obtiendrez 0 ou count +1, selon que l'entrée est inférieure ou supérieure à la plage.
Exemple :
SELECT
width_bucket(-3, 1, 12, 3),
width_bucket(20, 1, 12, 3);
Résultat :
width_bucket | width_bucket --------------+-------------- 0 | 4
Exemple – Troisième syntaxe
Afin de démontrer la troisième syntaxe, prenons le premier exemple ci-dessus et modifions-le pour utiliser la troisième syntaxe :
SELECT
width_bucket(3, array[1, 4, 8]),
width_bucket(5, array[1, 4, 8]),
width_bucket(9, array[1, 4, 8]);
Résultat :
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 1 | 2 | 3
Ici, j'ai créé 3 compartiments et attribué des valeurs explicites à chacun. Dans ce cas, ce sont tous des compartiments de largeur égale, mais ce n'est pas une obligation.
L'un des principaux avantages de la troisième syntaxe est qu'elle vous permet de créer des compartiments de largeur inégale.
Par exemple, je pourrais modifier l'exemple précédent en ceci :
SELECT
width_bucket(3, array[1, 3, 12]),
width_bucket(5, array[1, 3, 12]),
width_bucket(9, array[1, 3, 12]);
Résultat :
width_bucket | width_bucket | width_bucket --------------+--------------+-------------- 2 | 2 | 2
Cela modifie les compartiments auxquels chaque numéro est attribué. Maintenant, tous ces numéros appartiennent au deuxième seau.
La troisième syntaxe pourrait être utile pour une variété de cas d'utilisation. Par exemple, vous pouvez avoir une gamme de tranches d'âge qui ne sont pas également réparties.
SELECT
width_bucket(15, array[10, 18, 30, 50, 65]) AS "Age Group (15)",
width_bucket(45, array[10, 18, 30, 50, 65]) AS "Age Group (45)",
width_bucket(50, array[10, 18, 30, 50, 65]) AS "Age Group (50)";
Résultat :
Age Group (15) | Age Group (45) | Age Group (50) ----------------+----------------+---------------- 1 | 3 | 4
Hors de portée
La fonction renvoie 0 si l'entrée est inférieure à la première borne inférieure.
Exemple :
SELECT width_bucket(8, array[10, 40, 30]);
Résultat :
0
Width_Bucket() contre CAS
Les exemples sur cette page pourraient également être réalisés à l'aide d'un CASE
déclaration. La différence est que width_bucket()
le fait de manière plus concise.
Voici comment nous pourrions réécrire l'exemple précédent en utilisant un CASE
déclaration.
SELECT
CASE
WHEN 8 BETWEEN 0 AND 9 THEN 0
WHEN 8 BETWEEN 10 AND 39 THEN 1
WHEN 8 BETWEEN 40 AND 49 THEN 2
ELSE 3
END;
Résultat :
0
Gardez à l'esprit que l'entrée dans tous ces exemples serait normalement un nom de variable ou de colonne plutôt qu'une constante.