如何使用 Snowflake 获得累积产品?
How can I get a cumulative product with Snowflake?
我想计算 Snowflake 中跨行的累积乘积。
基本上我的月利率会随着时间的推移成倍累积。
(某些数据库具有 product()
SQL 函数)。
Sterling Paramore 建议的技巧:添加日志,然后取幂:
with data as (select x from values (1),(2),(3),(4),(5))
select x
, sum(x) over(order by x) sum
, exp(sum(ln(x)) over(order by x)) mult
from data
如果 built-in 函数不存在,通常可以使用 User-Defined Table Function.
来自定义一些内容
在这种情况下:
CREATE OR REPLACE FUNCTION CUMULATIVE_PRODUCT(VALUE double)
RETURNS TABLE (PRODUCT double)
LANGUAGE JAVASCRIPT
AS '{
initialize: function(argumentInfo, context) {
this.cumulativeProduct = 1;
},
processRow: function f(row, rowWriter, context){
this.cumulativeProduct = this.cumulativeProduct*row.VALUE;
rowWriter.writeRow({PRODUCT: this.cumulativeProduct});
}
}';
示例table:
create temp table sample_numbers as (
select 1 as index, 5.1::double as current_value
union all
select 2 as index, 4.3::double as current_value
union all
select 3 as index, 3.7::double as current_value
union all
select 4 as index, 3.9::double as current_value
)
调用 UDTF:
select index,current_value,PRODUCT as cumulative_product
from sample_numbers,table(CUMULATIVE_PRODUCT(current_value) over ())
请注意 empty over() clause 强制 Snowflake 对数据执行单个顺序 运行 而不是将其拆分为并行块
我想计算 Snowflake 中跨行的累积乘积。
基本上我的月利率会随着时间的推移成倍累积。
(某些数据库具有 product()
SQL 函数)。
Sterling Paramore 建议的技巧:添加日志,然后取幂:
with data as (select x from values (1),(2),(3),(4),(5))
select x
, sum(x) over(order by x) sum
, exp(sum(ln(x)) over(order by x)) mult
from data
如果 built-in 函数不存在,通常可以使用 User-Defined Table Function.
来自定义一些内容在这种情况下:
CREATE OR REPLACE FUNCTION CUMULATIVE_PRODUCT(VALUE double)
RETURNS TABLE (PRODUCT double)
LANGUAGE JAVASCRIPT
AS '{
initialize: function(argumentInfo, context) {
this.cumulativeProduct = 1;
},
processRow: function f(row, rowWriter, context){
this.cumulativeProduct = this.cumulativeProduct*row.VALUE;
rowWriter.writeRow({PRODUCT: this.cumulativeProduct});
}
}';
示例table:
create temp table sample_numbers as (
select 1 as index, 5.1::double as current_value
union all
select 2 as index, 4.3::double as current_value
union all
select 3 as index, 3.7::double as current_value
union all
select 4 as index, 3.9::double as current_value
)
调用 UDTF:
select index,current_value,PRODUCT as cumulative_product
from sample_numbers,table(CUMULATIVE_PRODUCT(current_value) over ())
请注意 empty over() clause 强制 Snowflake 对数据执行单个顺序 运行 而不是将其拆分为并行块