如何在雪花中编写用户定义的函数?

时间:2021-06-24 15:57:16

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

我对雪花很陌生。到目前为止,我一直使用 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 中获得了一些指导,但我还没有到那里。这是我得到的错误:

enter image description here

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

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

我希望这有助于...丰富

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