根据日期和在 Snowflake 中的另一个表中为该日期列出的最大行数限制插入到表中的行
Posted
技术标签:
【中文标题】根据日期和在 Snowflake 中的另一个表中为该日期列出的最大行数限制插入到表中的行【英文标题】:LIMIT the rows inserted into a table based on the date and the max row count number listed for that date in another table in Snowflake 【发布时间】:2020-08-13 15:33:27 【问题描述】:我有三张桌子。 my_db.threshold_table 包含每天我想插入到 my_db.daily_table 中的最大随机记录数,这些记录将在第二天插入之前被删除并重新创建。 cust_num 的源表是 my_db.customer_table
如何在 Snowflake SQL 中编写此代码?
(由我编辑:抱歉无法弄清楚如何在 *** 问题中发布表格并使其正确显示)
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章 |等等| +----------+
【问题讨论】:
【参考方案1】:如果您的情况允许您有多个 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 构造,这通常比每天执行删除 + 重新创建目标表要好得多。但是您可以决定这是否适合您的情况。
【讨论】:
@SteveMaritz:很高兴听到它对您有用。您没有“接受”这个答案有什么特别的原因吗? 没有。再次感谢。以上是关于根据日期和在 Snowflake 中的另一个表中为该日期列出的最大行数限制插入到表中的行的主要内容,如果未能解决你的问题,请参考以下文章
当用户在 MS Access 中修改表中的另一列时,如何在 SQL Server 中将列设置为今天的日期 [关闭]