Catégories :

Fonctions numériques

WIDTH_BUCKET

Construit des histogrammes de largeur égale, dans lesquels la plage de l’histogramme est divisée en intervalles de taille identique et retourne le nombre de compartiments dans lesquels la valeur d’une expression échoue, après son évaluation. La fonction retourne une valeur entière ou « null » (si une entrée est « null »).

Syntaxe

WIDTH_BUCKET( <expr> , <min_value> , <max_value> , <num_buckets> )

Arguments

expr

Expression pour laquelle l’histogramme est créé. Cette expression doit être évaluée à une valeur numérique ou à une valeur qui peut être implicitement convertie en valeur numérique.

La valeur doit être comprise entre -(2^53 - 1) et 2^53 - 1 (inclus).

valeur_min et valeur_max

Les points de terminaison bas et hauts de la plage acceptable pour l’expression. Les points de terminaison doivent également être évalués par rapport à des valeurs numériques et ne pas être égaux.

Les points extrêmes bas et haut doivent être compris entre -(2^53 - 1) et 2^53 - 1 (inclus). En outre, la différence entre ces points doit être inférieure à 2^53 (c’est-à-dire abs(valeur_max - valeur_min) < 2^53).

nb_compartiments

Le nombre de compartiments désiré ; doit être une valeur entière positive. Une valeur de l’expression est assignée à chaque bucket, et la fonction renvoie alors le numéro de bucket correspondant.

Lorsqu’une expression se situe en dehors de la plage, la fonction retourne :

  • 0 si l’expression est inférieure à valeur_min.

  • nb_compartiments + 1 si l’expression est supérieure ou égale à valeur_max.

Exemple

Créez un histogramme de quatre compartiments sur la colonne price pour des maisons vendues dans la fourchette de prix allant de 200 000 $ à 600 000 $, classées par date de vente. La fonction retourne le numéro de compartiment (SALES GROUP) pour chaque valeur de l’ensemble.

Créez et remplissez une table :

CREATE TABLE home_sales (
    sale_date DATE,
    price NUMBER(11, 2)
    );
INSERT INTO home_sales (sale_date, price) VALUES 
    ('2013-08-01'::DATE, 290000.00),
    ('2014-02-01'::DATE, 320000.00),
    ('2015-04-01'::DATE, 399999.99),
    ('2016-04-01'::DATE, 400000.00),
    ('2017-04-01'::DATE, 470000.00),
    ('2018-04-01'::DATE, 510000.00);

Interrogez la table en appelant WIDTH_BUCKET() :

SELECT 
    sale_date, 
    price,
    WIDTH_BUCKET(price, 200000, 600000, 4) AS "SALES GROUP"
  FROM home_sales
  ORDER BY sale_date;
+------------+-----------+-------------+
| SALE_DATE  |     PRICE | SALES GROUP |
|------------+-----------+-------------|
| 2013-08-01 | 290000.00 |           1 |
| 2014-02-01 | 320000.00 |           2 |
| 2015-04-01 | 399999.99 |           2 |
| 2016-04-01 | 400000.00 |           3 |
| 2017-04-01 | 470000.00 |           3 |
| 2018-04-01 | 510000.00 |           4 |
+------------+-----------+-------------+