类别:

窗口函数 (通用)

RATIO_TO_REPORT

返回组内某个值与组内值之和的比率。如果 expr1 的计算结果为 null,或组内 expr1 之和的计算结果为 0,则 RATIO_TO_REPORT 返回 null。

语法

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

实参

expr1

这是一个计算结果为数值数据类型(INTEGER、FLOAT、DECIMAL 等)的表达式。

expr2

这是用于划分分区的可选表达式。

expr3

这是每个分区中作为排序规则的可选表达式。请注意,对于此函数,分区内的顺序不会影响输出。

在此函数中,与在所有窗口函数中一样,此 ORDER BY 并不控制整个查询输出的顺序。

使用说明

  • RATIO_TO_REPORT 计算公式为:

    当前行的 expr1 实参值/分区的 expr1 实参之和

  • 在此函数中,允许在 OVER() 子句内使用 ORDER BY 分子句,以便与其他窗口函数保持语法一致性,但 ORDER BY 并不影响计算。使用此函数时,Snowflake 建议不要在 OVER 子句中包含 ORDER BY 分子句。

示例

这个简单的示例显示了每家店铺为连锁店产生的利润所占的百分比:

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

这显示了每个省份的每家店铺产生的利润在该省所占的百分比:

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
语言: 中文