首页 > 解决方案 > 根据日期和在 Snowflake 中的另一个表中为该日期列出的最大行数限制插入到表中的行

问题描述

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

如何在 Snowflake SQL 中编写此代码?

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

my_db.threshold_table

+-----------+--------+----------+ | 运行_DT | | 最大行数 | +-----------+--------+----------+ | 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

+----------+ | 客户编号 | +----------+ | 1111 | | 第1222章 | 第1333章 | 第1444章 | 等等| +----------+

My_db.customer_table

+----------+ | 客户编号 | +----------+ | 1111 | | 2111 | | 第1222章 | 第1333章 | 第2222章 | 第1444章 | 第2333章 | 等等| +----------+

标签: snowflake-cloud-data-platform

解决方案


如果您的情况允许您有多个 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)
;

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

INSERT OVERWRITE INTO MY_DB.DAILY_TABLE (
  CUST_NUM
)
SELECT C.CUST_NUM
  FROM MY_DB.CUSTOMER_TABLE C
       CROSS JOIN MY_DB.THRESHOLD_TABLE T
 WHERE T.RUN_DT = CURRENT_DATE()
QUALIFY ROW_NUMBER() OVER (ORDER BY RANDOM()) <= T.MAX_ROWS
;

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


推荐阅读