Excel 喜欢 SNOWFLAKE 中的 AVERAGE FUNCTION
Excel Like AVERAGE FUNCTION in SNOWFLAKE
我试图在 Snowflake 中找到与 AVERAGE() excel 函数等效的函数,但我似乎找不到它。
我想在 Snowflake 中执行以下操作,其中 AVG_CustomFunc 是一个自定义函数,参数列表最多可以增加 100 个参数(excel 中为 255):
SELECT AVG_CustomFunc(tab.col1, tab.col2, tab.col3)
from tab
或
SELECT AVG_CustomFunc(tab.col1, tab.col2)
from tab
IF 选项卡有 3 列,其中 col1 => 1,col2 => 2 & col3 => 3,我希望第一个查询的结果为 2.0,第二个查询的结果为 1.5
虽然最初是使用默认值创建单个函数,但 Snowflake 目前不允许在函数参数中使用默认值
对此还有其他解决方案或建议吗
AVG()
是一个聚合函数,对行组进行操作。
您希望在一行中进行计算,因此只需使用算术即可。如果 none 个值是 null
:
(col1 + col2 + col3) / 3 as myavg
如果我们想像 AVG()
那样处理空值:
(coalesce(col1, 0) + coalesce(col2, 0) + coalesce(col3, 0))
/ nullif(
case when col1 is null then 0 else 1 end
+ case when col2 is null then 0 else 1 end
+ case when col3 is null then 0 else 1 end,
0) as myavg
LATERAL
和 AVG
聚合函数应该足够了:
SELECT tab.*, s.calc_average
FROM tab,
LATERAL (SELECT AVG(sub.col) AS calc_average
FROM(SELECT tab.col1 UNION ALL SELECT tab.col2 UNION ALL SELECT tab.col3) sub(col)
) s;
它将像标准 AVG
一样运行,无需添加额外的 NULL 处理,并且可以轻松扩展以包含更多列。
这个公式是否适用于数组?
select t.*,
(select avg(value)
from flatten(input => t.ar)
)
from (select t.*, array_construct_compact(col1, col2, . . . ) as ar
from t
) t ;
我能够使用 Javascript 函数解决这个问题
CREATE OR REPLACE FUNCTION AVGF (STR VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS $$
var str_array = String(STR).split(",");
var total = 0.0
for (i = 0; i < str_array.length; i += 1) {
total += parseFloat(str_array[i]);
}
return total/str_array.length;
$$
;
现在我可以做
SELECT AVGF(tab.col1, tab.col2)
from tab
和
SELECT AVGF(tab.col1, tab.col2, tab.col3)
from tab
我试图在 Snowflake 中找到与 AVERAGE() excel 函数等效的函数,但我似乎找不到它。
我想在 Snowflake 中执行以下操作,其中 AVG_CustomFunc 是一个自定义函数,参数列表最多可以增加 100 个参数(excel 中为 255):
SELECT AVG_CustomFunc(tab.col1, tab.col2, tab.col3)
from tab
或
SELECT AVG_CustomFunc(tab.col1, tab.col2)
from tab
IF 选项卡有 3 列,其中 col1 => 1,col2 => 2 & col3 => 3,我希望第一个查询的结果为 2.0,第二个查询的结果为 1.5
虽然最初是使用默认值创建单个函数,但 Snowflake 目前不允许在函数参数中使用默认值
对此还有其他解决方案或建议吗
AVG()
是一个聚合函数,对行组进行操作。
您希望在一行中进行计算,因此只需使用算术即可。如果 none 个值是 null
:
(col1 + col2 + col3) / 3 as myavg
如果我们想像 AVG()
那样处理空值:
(coalesce(col1, 0) + coalesce(col2, 0) + coalesce(col3, 0))
/ nullif(
case when col1 is null then 0 else 1 end
+ case when col2 is null then 0 else 1 end
+ case when col3 is null then 0 else 1 end,
0) as myavg
LATERAL
和 AVG
聚合函数应该足够了:
SELECT tab.*, s.calc_average
FROM tab,
LATERAL (SELECT AVG(sub.col) AS calc_average
FROM(SELECT tab.col1 UNION ALL SELECT tab.col2 UNION ALL SELECT tab.col3) sub(col)
) s;
它将像标准 AVG
一样运行,无需添加额外的 NULL 处理,并且可以轻松扩展以包含更多列。
这个公式是否适用于数组?
select t.*,
(select avg(value)
from flatten(input => t.ar)
)
from (select t.*, array_construct_compact(col1, col2, . . . ) as ar
from t
) t ;
我能够使用 Javascript 函数解决这个问题
CREATE OR REPLACE FUNCTION AVGF (STR VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS $$
var str_array = String(STR).split(",");
var total = 0.0
for (i = 0; i < str_array.length; i += 1) {
total += parseFloat(str_array[i]);
}
return total/str_array.length;
$$
;
现在我可以做
SELECT AVGF(tab.col1, tab.col2)
from tab
和
SELECT AVGF(tab.col1, tab.col2, tab.col3)
from tab