Catégories :

Fonctions de la fenêtre (Général)

RATIO_TO_REPORT

Renvoie le rapport d’une valeur au sein d’un groupe à la somme des valeurs au sein du groupe. Si expr1 correspond à null ou si la somme de expr1 dans le groupe correspond à 0, alors RATIO_TO_REPORT renvoie null.

Syntaxe

RATIO_TO_REPORT( <expr1> ) [ OVER ( [ PARTITION BY <expr2> ] [ ORDER BY <expr3> ] ) ]
Copy

Arguments

expr1

L’expression est une expression qui correspond à un type de données numérique (INTEGER, FLOAT, DECIMAL, etc.).

expr2

C’est l’expression facultative à partir de laquelle effectuer la partition.

expr3

C’est l’expression facultative à partir de laquelle effectuer le classement dans chaque partition. Notez que pour cette fonction, l’ordre dans la partition n’affecte pas la sortie.

Dans cette fonction, comme dans toutes les fonctions de fenêtre, cette commande ORDER BY ne contrôle pas l’ordre de la sortie de la requête entière.

Notes sur l’utilisation

  • RATIO_TO_REPORT est calculé comme suit :

    valeur de l’argument expr1 pour la ligne en cours / somme de l’argument expr1 pour la partition

  • La sous-clause ORDER BY de la clause OVER() est autorisée dans cette fonction pour des raisons de cohérence syntaxique avec d’autres fonctions de fenêtre, mais ORDER BY n’affecte pas le calcul. Snowflake recommande de ne pas inclure de sous-clause ORDER BY dans la clause OVER lors de l’utilisation de cette fonction.

Exemples

Cet exemple simple montre le pourcentage du profit d’une chaîne de magasins généré par chaque magasin :

CREATE TABLE store_profit (
    store_ID INTEGER, 
    province VARCHAR,
    profit NUMERIC(11, 2));
INSERT INTO store_profit (store_ID, province, profit) VALUES
    (1, 'Ontario', 300),
    (2, 'Saskatchewan', 250),
    (3, 'Ontario', 450),
    (4, 'Ontario', NULL)  -- hasn't opened yet, so no profit yet.
    ;
Copy
SELECT 
        store_ID, profit, 
        100 * RATIO_TO_REPORT(profit) OVER () AS percent_profit
    FROM store_profit
    ORDER BY store_ID;
+----------+--------+----------------+
| STORE_ID | PROFIT | PERCENT_PROFIT |
|----------+--------+----------------|
|        1 | 300.00 |    30.00000000 |
|        2 | 250.00 |    25.00000000 |
|        3 | 450.00 |    45.00000000 |
|        4 |   NULL |           NULL |
+----------+--------+----------------+
Copy

Cela montre le pourcentage de profit dans chaque province généré par chaque magasin dans cette province :

SELECT 
        province, store_ID, profit, 
        100 * RATIO_TO_REPORT(profit) OVER (PARTITION BY province) AS percent_profit
    FROM store_profit
    ORDER BY province, store_ID;
+--------------+----------+--------+----------------+
| PROVINCE     | STORE_ID | PROFIT | PERCENT_PROFIT |
|--------------+----------+--------+----------------|
| Ontario      |        1 | 300.00 |    40.00000000 |
| Ontario      |        3 | 450.00 |    60.00000000 |
| Ontario      |        4 |   NULL |           NULL |
| Saskatchewan |        2 | 250.00 |   100.00000000 |
+--------------+----------+--------+----------------+
Copy