Categorias:

Funções de janela (General)

RATIO_TO_REPORT

Retorna a razão de um valor dentro de um grupo em relação à soma dos valores dentro do grupo. Se expr1 é avaliado como nulo ou a soma de expr1 dentro do grupo é avaliado como 0, então RATIO_TO_REPORT retorna nulo.

Sintaxe

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

Argumentos

expr1

Esta é uma expressão que é avaliada como um tipo de dados numérico (INTEGER, FLOAT, DECIMAL etc.).

expr2

Esta é a expressão opcional para divisão.

expr3

Esta é a expressão opcional a ordenar dentro de cada partição. Note que, para esta função, a ordem dentro da partição não afeta a saída.

Nesta função, como em todas as funções de janela, este ORDER BY não controla a ordem de toda a saída da consulta.

Notas de uso

  • RATIO_TO_REPORT é calculado como:

    valor do argumento expr1 para a linha atual / soma do argumento expr1 para a partição

  • A subcláusula ORDER BY na cláusula OVER() é permitida nesta função para consistência sintática com outras funções de janela, mas ORDER BY não afeta o cálculo. O Snowflake recomenda não incluir uma subcláusula ORDER BY na cláusula OVER ao usar esta função.

Exemplos

Este simples exemplo mostra a porcentagem do lucro de uma cadeia de lojas que foi gerado por cada loja individual:

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

Isso mostra a porcentagem de lucro dentro de cada província gerada por cada loja naquela província:

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