问题描述
我有三个桌子。 my_db.threshold_table包含每天要插入my_db.daily_table的最大随机记录数,该记录将在插入第二天之前删除并重新创建。 cust_num的源表是my_db.customer_table
(由我编辑:对不起,无法弄清楚如何在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 +重新创建要好得多。但是,您可以决定这是否适合您的情况。