首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >雪花SQL UDF: SELECT TOP N,LIMIT,ROW_NUMBER()和RANK()在子查询中不起作用?

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

Stack Overflow用户
提问于 2020-01-21 16:57:30
回答 1查看 894关注 0票数 0

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

下面是我尝试过的一种方法的示例:

代码语言:javascript
复制
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
  ';
EN

回答 1

Stack Overflow用户

发布于 2020-01-22 02:22:59

UDF是标量的。它们将只返回一个指定类型的值,在本例中为date。如果要为列返回一组值,则可能需要研究UDTF,即用户定义的表函数,它们返回表。

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

只需对UDF稍作修改,即可将其转换为UDTF。您可以将列而不是标量值传递给它。然后,可以将从UDTF得到的表与基表连接起来,以获得工作日加法值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59837361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档