Excel 类似于 SNOWFLAKE 中的 AVERAGE FUNCTION
Posted
技术标签:
【中文标题】Excel 类似于 SNOWFLAKE 中的 AVERAGE FUNCTION【英文标题】:Excel Like AVERAGE FUNCTION in SNOWFLAKE 【发布时间】:2020-12-23 10:10:07 【问题描述】:我试图在 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 目前不允许函数参数中的默认值
是否有其他解决方案或建议
【问题讨论】:
嗯,有documentation for it。你的语法正确吗? 我知道 Snowflake 中的 AVG 函数,我想创建一个自定义函数,该函数将对列而不是行进行平均 您是否考虑过先对数据进行透视,在这种情况下,然后求平均值?NULL
值有问题吗?
我需要忽略 NULL 值
【参考方案1】:
AVG()
是一个聚合函数,对多组行进行操作。
您希望在单行上进行计算,因此只需使用算术即可。如果没有一个值是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
【讨论】:
如果只有在运行时才知道列数怎么办? @AnupThomas:我会说,如果您在运行时有未定义的列数,那么您可能会遇到比您在此处解释的更大的问题。基本上这意味着您需要动态 SQL,这似乎超出了您原始问题的范围 你是对的!也许我应该编辑我的问题..会做..谢谢!【参考方案2】: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 处理,并且可以轻松扩展以包含更多列。
【讨论】:
我仍然无法创建函数,因为它会引发不受支持的子查询错误【参考方案3】:这个公式是否适用于数组?
select t.*,
(select avg(value)
from flatten(input => t.ar)
)
from (select t.*, array_construct_compact(col1, col2, . . . ) as ar
from t
) t ;
【讨论】:
我无法创建函数,因为它会引发不受支持的子查询错误 @AnupThomas 。 . .谢谢你的检查。 Snowflakeflatten()
在其他数据库中的通用性远低于unnest()
。真可惜,我希望他们能解决这个问题。这种类型的构造在并行数据库上具有一些显着的性能优势。【参考方案4】:
我能够使用 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
【讨论】:
以上是关于Excel 类似于 SNOWFLAKE 中的 AVERAGE FUNCTION的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu中的LibreOffice是不是有类似于Microsoft office(word,excel等)的vba宏的东西? [关闭]