Snowflake SQL UDF:SELECT TOP N,LIMIT,ROW_NUMBER()和RANK()在子查询中不起作用?

问题描述 投票:0回答:1

我一直在尝试使用Snowflake SQL UDF解决方案,以将所需的工作天数添加到时间戳中。我一直在尝试定义一个函数,该函数需要一个时间戳和所需的工作日数作为参数添加并返回一个日期。该函数使用日期维表。当我将单个日期作为参数传递给该函数时,该函数将起作用,但是每当我尝试为其提供完整的日期列时,它将引发错误“无法评估不受支持的子查询类型”。似乎每当我尝试在子查询中使用SELECT TOP N,LIMIT,ROW_NUMBER()或RANK()时,就会发生这种情况。

这里是我尝试过的方法的一个示例:

CREATE OR REPLACE FUNCTION "ADDWORKINGDAYSTOWORKINGDAY"(STARTDATE TIMESTAMP_NTZ, DAYS NUMBER)
RETURNS DATE
LANGUAGE SQL
AS '
    WITH CTE AS ( 
SELECT PAIVA 
    FROM EDW_DEV.REPORTING_SCHEMA."D_PAIVA"
    WHERE ARKIPAIVA = 1 AND ARKIPYHA_FI = FALSE 
    AND 1 = CASE WHEN DAYS < 0 AND P.PAIVA < TO_DATE(STARTDATE) THEN 1
                 WHEN DAYS < 0 AND P.PAIVA >= TO_DATE(STARTDATE) THEN 0
                 WHEN DAYS >= 0 AND P.PAIVA > TO_DATE(STARTDATE) THEN 1
                 ELSE 0
            END),
CTE2 AS (           
SELECT
    PAIVA
    ,CASE WHEN DAYS >= 0 THEN RANK() OVER
        (ORDER BY PAIVA)
        ELSE RANK() OVER 
        (ORDER BY PAIVA DESC)
    END AS RANK
FROM CTE
ORDER BY RANK)

SELECT TOP 1
ANY_VALUE (CASE WHEN DAYS IS NULL OR TO_DATE(STARTDATE) IS NULL THEN NULL
     WHEN DAYS = 0 THEN TO_DATE(STARTDATE)
     ELSE PAIVA
     END) AS PAIVA
FROM CTE2 
WHERE CASE  WHEN DAYS IS NULL OR TO_DATE(STARTDATE) IS NULL THEN 1 = 1
            WHEN DAYS > 0 THEN RANK = DAYS
            WHEN DAYS = 0 THEN 1 = 1
            ELSE RANK = -DAYS
      END
  ';
sql user-defined-functions snowflake-data-warehouse
1个回答
0
投票

UDF是标量。它们将仅返回指定类型的一个值,在这种情况下为日期。如果要为列返回一组值,则可能要研究返回表的UDTF(用户定义的表函数)。

https://docs.snowflake.net/manuals/sql-reference/udf-table-functions.html

通过对UDF进行一些修改,您可以将其转换为UDTF。您可以将其传递给列而不是标量值。然后,您可以将UDTF生成的表与基本表连接起来,以获得工作日附加值。

© www.soinside.com 2019 - 2024. All rights reserved.