snowflake sql udf返回“未知用户定义函数”错误

tp5buhyn  于 2021-08-13  发布在  Java
关注(0)|答案(0)|浏览(214)

我正在尝试使用sql语法在snowflake中构建一个查询。虽然它基本上是可接近的,但我在创建一个特定的查询时遇到了问题。snowflake似乎不支持嵌套的select语句,并返回错误“unsupported subquery type cannot be evaluation”。
如果您能就如何着手解决这个问题提供任何反馈或意见,我将不胜感激。
下面是我希望查询按逻辑运行的方式:

create function demofunc(id varchar)
    returns table(
                  float,
                  float
    )
as
$$
    SELECT
      a.value1 as value1,
      func_other(id, a.value2) as value2 --where func_other returns a float and works fine
    FROM
      (
           SELECT
                     SUM(table1.value1) as value1,
                     table1.value2 as value2
           FROM      demotable table1
           WHERE
                     table1.id = id
           GROUP BY value2
      ) a
$$;

运行此命令会产生“不支持的子查询类型无法计算”,因此我尝试使用snowflake文档上的建议来重做它,如下所示,https://docs.snowflake.com/en/sql-reference/udf-sql.html#troubleshooting,他们建议将所有的东西分离成各自的功能,但仍然没有帮助。

create function func_1(id varchar)
    returns table(
            value1 float,
            value2 date
    )
as
$$
  SELECT
        SUM(table1.value1) as value1,
        table1.value2 as value2
  FROM demotable table1
  WHERE
       table1.id = id
  GROUP BY value2
$$;
----------------------------------------
create function func_2(id varchar)
    returns table(
            value1 float,
            value2 float
    )
as
$$
  SELECT
      a.value1 as value1,
      func_other(id, a.value2) as value2 --where func_other returns a float and works fine
  FROM
      TABLE(func_1(id)) a
$$;
----------------------------------------
select * from TABLE(func_2('AAAAA'))

有人知道一个好的攻击计划或解决方法吗?谢谢您。
编辑:我在下面添加了另一个函数func\u other。最初的子查询问题似乎是因为我在func\u other中的select语句的where子句中包含了一个函数调用。然而,在试图改善这一点时,我导致了一个新的错误,即处理被简单地中止。结果,我现在从snowflake的方面得到了一个执行错误,目前正在等待解决。
为了解决这个问题,我选择了两个值,而不是在where子句中使用函数调用,然后调用一个单独的函数step\u func\u other,而不是func\u other,它只选择新func\u other返回的一个值。所有这些都是独立工作的,但是当合并到主调用(func2)中时,执行就会中断。
旧的:

create function func_other(id varchar, value2 date)
    returns float
as
$$
    SELECT value3 as value3
    FROM table2
    WHERE
         p_id = id
         AND p_date = func_prev(id, value2)

$$;

其中func_prev定义为:

create function func_prev(id varchar, value2 date)
    returns date
as
$$
    SELECT 
         MAX(p_date) as p_date
    FROM 
         table2
    WHERE 
         p_id = id
         AND p_date < value2
$$;

新增:

create function func_other(id varchar, value2 date)
    returns TABLE(value3 float, p_date date)
as
$$
    SELECT
        value3 as value3,
        func_prev(id, value2) as p_date
    FROM
        table2
    WHERE
        p_id = id
        AND p_date = p_date

$$;
-----------
create function step_func_other(id varchar, value2 date)
    returns float
as
$$
    SELECT
          CASE
              WHEN value2 IS NULL
                  THEN NULL
              ELSE value3
          END AS value3
    FROM
         TABLE(func_other(id, value2))
$$;

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题