- 类别:
窗口函数 (通用)
RATIO_TO_REPORT¶
返回组内某个值与组内值之和的比率。如果 expr1
的计算结果为 null,或组内 expr1
之和的计算结果为 0,则 RATIO_TO_REPORT 返回 null。
语法¶
RATIO_TO_REPORT( <expr1> ) [ OVER ( [ PARTITION BY <expr2> ] [ ORDER BY <expr3> ] ) ]
实参¶
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. ;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 | +----------+--------+----------------+
这显示了每个省份的每家店铺产生的利润在该省所占的百分比:
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 | +--------------+----------+--------+----------------+