根据日期和雪花中另一个表中该日期列出的最大行数限制LIMIT插入表中的行

问题描述

我有三个桌子。 my_db.threshold_table包含每天要插入my_db.daily_table的最大随机记录数,该记录将在插入第二天之前删除并重新创建。 cust_num的源表是my_db.customer_table

如何在SNowflake sql中编写此代码

(由我编辑:对不起,无法弄清楚如何在stackoverflow问题中发布表格并使其正确显示

my_db.threshold_table

+ ----------- + ------- + ---------- + | Run_DT | | Max_Rows | + ----------- + ------- + ---------- + | 2020年8月22日| 348 | | | 2020年8月23日| 418 | | | 2020年8月24日| 523 | | | 2020年8月25日| 653 | | | 2020年8月26日| 816 | | | 2020年8月27日| 1,021 | | | 2020年8月28日| 1,276 | | | 2020年8月29日| 1,595 | | | 2020年8月30日| 1,993 | | | 2020年8月31日| 2,492 | | | 2020年9月1日| 3,115 | | | 2020年9月2日| 3,893 | | + ----------- + ------- + ---------- +

my_db.daily_table

+ ---------- + | cust_num | + ---------- + | 1111 | | 1222 | | 1333 | | 1444 | |等等。 + ---------- +

My_db.customer_table

+ ---------- + | cust_num | + ---------- + | 1111 | | 2111 | | 1222 | | 1333 | | 2222 | | 1444 | | 2333 | |等等。 + ---------- +

解决方法

如果您的情况允许您使用多个SQL语句来实现结果,则此方法应该简单有效:

<OutputClaim ClaimTypeReferenceId="email" DefaultValue=""/>

如果需要在单个SQL语句中执行此操作,则可以改用这种方法:

SET MAX_ROWS = (SELECT IFNULL(ANY_VALUE(MAX_ROWS),0) AS MAX_ROWS FROM (SELECT MAX_ROWS FROM MY_DB.THRESHOLD_TABLE WHERE RUN_DT < CURRENT_DATE()))
;
INSERT OVERWRITE INTO MY_DB.DAILY_TABLE (
  CUST_NUM
)
SELECT CUST_NUM
  FROM MY_DB.CUSTOMER_TABLE SAMPLE ($MAX_ROWS ROWS)
;

注意:我选择在这里使用INSERT OVERWRITE构造,通常比每天执行目标表的drop +重新创建要好得多。但是,您可以决定这是否适合您的情况。