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】:

LATERALAVG 聚合函数就足够了:

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 。 . .谢谢你的检查。 Snowflake flatten() 在其他数据库中的通用性远低于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的主要内容,如果未能解决你的问题,请参考以下文章

有哪些选项可用于获取 Snowflake 中的主键列名称?

Ubuntu中的LibreOffice是不是有类似于Microsoft office(word,excel等)的vba宏的东西? [关闭]

在 Snowflake 中构建 OLAP Cube

使用类似于 QueryTable 的东西导入 excel 文件?

MS SQL 转置类似于 Excel 转置(动态 SQL)

Pandas 小计类似于 Excel