【问题标题】:Snowflake SQL UDF - Unsupported Subquery ErrorSnowflake SQL UDF - 不支持的子查询错误
【发布时间】:2023-01-13 06:18:28
【问题描述】:

我正在创建 Snowflake SQL UDF。我一直遇到SQL 编译错误:无法计算不支持的子查询类型.我已经尝试做几件事来解决这个问题,这是我最近的尝试。

我怎样才能摆脱子查询错误?

UDF 应该允许输入他们喜欢的年份。如果未提供年份,则考虑创建解决方案,默认为当前年份。

create or replace function new_value(PRICE float, TYPE varchar, YR_CREATED int, YEAR int)

returns float

as
$$

 
with AGE_OF_PRODUCT as (
    select any_value((YEAR - YR_CREATED)) as AGE ),



  FORMULA as (
    select any_value(AGE) as AGE,
    any_value(case
        when AGE <= 1 then 1
        else 2
    end) as FUNCTION
    from AGE_OF_PRODUCT

  )
  
  select
     any_value(case
        when F.FUNCTION = 1 then (PRICE - (PRICE * R.R1))
        else (PRICE * (1 - (R.R1))) * pow((1-(R.R2)), ((F.AGE - YR_CREATED)-1))
    end) as VALUE
  from FORMULA as F, RATES as R
  where TYPE = R.TYPE_OF_PRODUCT

  
                                      
$$;

【问题讨论】:

  • 您对 ANY_VALUE 的过度使用很奇怪,您能解释一下为什么要添加这些值吗?
  • 无论如何,主要问题是您将在 WHERE 或 SELECT 部分中使用此 UDF,并且鉴于它是一个子选择,这意味着结果代码是一个 COROLATED SUBQUERY,并且这些支持有限。因此,在某种程度上,您需要展开它并仅使用 UDF 来进行混乱的数学运算,而无需从 RATES 表中进行选择,这些应该被传入。

标签: sql subquery snowflake-cloud-data-platform user-defined-functions


【解决方案1】:

所以主要问题是你可能使用这样的功能:

select v.*,
    new_value(v.price, v.type, v.yr_create, v.year) as awesome
from table_with_values as v

您的 UDF 也可以重写为:

create or replace function new_value(
    PRICE float, 
    TYPE varchar, 
    YR_CREATED int, 
    YEAR int)
returns float
as
$$

    select
        YEAR - YR_CREATED as age,
        case age <= 1
            when true then (PRICE - (PRICE * r.r1))
            else (PRICE * (1 - (r.r1))) * pow((1-(r.r2)), ((age - YR_CREATED)-1))
        end as value
    from rates as r
    where TYPE = r.type_of_product
                      
$$;

但是如果我们将联接移动到 UDF 之外的速率

create or replace function new_value(
    PRICE float, 
    YR_CREATED int, 
    YEAR int,
    rate1 float,
    rate2 float)
returns float
as
$$
    select
        case (YEAR - YR_CREATED) <= 1
            when true then (PRICE - (PRICE * r.r1))
            else (PRICE * (1 - (rate1))) * pow((1-(rate2)), (((YEAR - YR_CREATED) - YR_CREATED)-1))
        end as value;                     
$$;

然后我们可以这样称呼它:

select v.*,
    new_value(v.price, v.yr_create, v.year, r.r1, r.r2) as awesome
from table_with_values as v
join rates as r 
    on v.type = r.type_of_product

【讨论】:

    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多