【问题标题】:How to write user-defined functions in snowflake?如何在雪花中编写用户定义的函数?
【发布时间】:2021-06-25 00:23:19
【问题描述】:

我对 Snowflake 很陌生。到目前为止,我一直使用 Teradata 编写复杂的 SQL 查询。 在雪花中,我需要创建和调用宏(类似于 Teradata),其中我必须将日期作为参数传递,并且在函数中我必须在表中附加记录。大致如下:

CREATE TABLE SFAAP.WS_DIRBNK_DPST.PV_HIGH_RISK_FI_LIST
(
APP_DT DATE
,FI_NAME VARCHAR(50)  
);



CREATE OR REPLACE FUNCTION SFAAP.INSERT_FI (DT DATE, CRED CHAR(5))
    --RETURNS NULL
    --COMMENT='Create list of high risk FI by date'
    AS 
    '
    INSERT INTO SFAAP.WS_DIRBNK_DPST.PV_HIGH_RISK_FI_LIST
    TO_DATE(DD)             --------------Passed Parameter
    ,FI_NAME
    FROM  
    (
    SELECT
    FINANCIAL_INSTITUTION AS FI_NAME
    ,COUNT(DISTINCT CASE WHEN IND_FPFA_FRAUD = 1 THEN APP_ID ELSE NULL END) AS TOT_FPFA_APPS 
    ,COUNT(DISTINCT APP_ID) AS TOT_APPS
    ,CAST(TOT_FPFA_APPS AS DECIMAL(38,2))/TOT_APPS AS FRAUD_RATE
    FROM
        (
        SELECT
        A.*
        ,C.FINANCIAL_INSTITUTION
        FROM BASE_05 A
        LEFT JOIN 
                (
                SELECT
                BNK_ACCT_NBR_TOK
                ,BNK_TRAN_TYP_CDE 
                ,ALT_DR_CR_CDE
                ,TRAN_1_DSC_TOK
                ,TRAN_DT
                ,TRAN_AMT
                FROM "SFAAP"."V_SOT_DIRBNK_CLB_FRD_CRD"."BNK_DPS_TRAN_RLT_INFO" 
                WHERE TRAN_DT BETWEEN DATEADD(Day,-90,TO_DATE(DD)) AND TO_DATE(DD)   --------------Passed Parameter, does calculation in the 90 days window from the passed date
                AND ALT_DR_CR_CDE = TO_CHAR(CRED) --------------Passed Parameter
                AND BNK_TRAN_TYP_CDE IN (22901,56003,56002,56302,56303,56102,70302)
                AND TRAN_AMT>=5
                QUALIFY ROW_NUMBER() OVER(PARTITION BY BNK_ACCT_NBR_TOK, TRAN_DT, TRAN_AMT, BNK_TRAN_TYP_CDE  ORDER BY TRAN_DT ASC, TRAN_AMT DESC)=1
                ) B
                ON A.BNK_ACCT_NBR = B.BNK_ACCT_NBR_TOK 

                LEFT JOIN SFAAP.WS_DIRBNK_DPST.PV_FRAUD_METRICS_03 C
                ON B.TRAN_1_DSC_TOK = C.TOKEN_NAME
        )SUB_A
    GROUP BY 1
    )SUB_B
    WHERE FINANCIAL_INSTITUTION IS NOT NULL  
    AND TOT_APPS>=3
    AND FRAUD_RATE>=0.20
    '
    ;

我从这个答案here 中得到了一些指导,但我还没有到那里。这是我得到的错误:

由于缺乏编写雪花用户定义函数的经验,我认为我在某处弄乱了语法(可能是我传递这两个参数的方式)。欢迎提出意见/建议。

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    看起来 SFAAP 是您的数据库名称,如果您要使用“完全限定名称”,请包括您的架构名称,或者更改您的会话上下文以使用数据库和架构,然后创建没有数据库和架构的函数名字。

    示例: 创建或替换函数 SFAAP.WS_DIRBNK_DPST.INSERT_FI (

    我希望这会有所帮助...丰富

    附言如果这个(或另一个)答案对您有帮助,请花点时间“接受”有帮助的答案 通过单击答案旁边的复选标记将其从“灰色”切换为“已填充”。

    【讨论】:

    • 感谢 Rich 的建议。看起来我遇到了一个新错误,上面写着SQL access control error: Insufficient privileges to operate on schema 'WS_DIRBNK_DPST'。让我和我公司的管理员谈谈。
    • 由于答案帮助您克服了最初的错误,请考虑花点时间“接受”答案并针对您遇到的架构权限错误提出一个新问题(@987654321 上的文档链接@)
    • 参数传递对您来说是否可行?我不知道,因为我还没有特权。只要确保语法的其余部分看起来正常/没有错误。
    • @Piyush Verma 您正在尝试在 UDF 中执行插入操作,我怀疑您是否可以在 SQL UDF 中执行这些 DML:s,只需查看文档即可。docs.snowflake.com/en/developer-guide/udf/sql/udf-sql.html
    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2020-04-09
    相关资源
    最近更新 更多