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  

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 处理,并且可以轻松扩展以包含更多列。

这个公式是否适用于数组?

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