在Snowflake中创建无唯一ID的表Staging及Merge至目标表的任务/存储过程
无唯一行ID时Snowflake的Merge自动化去重方案问题
我需要实现Snowflake中的Merge自动化方案,核心要求是不依赖唯一行标识符,避免向目标聚合表插入重复值。具体场景如下:
需求说明
基于两张表的关联逻辑构建最终聚合表,要求随新数据到达持续追加。目前已通过视图验证聚合逻辑正确,思路是创建按日期分区的stage表,通过视图关联提取当日及前一日的数据(主表每日更新两次,确保无数据遗漏)。
Stage表示例
Stage表与目标表结构一致,记录指定日期的患者数据及统计值(Unique_Patients_Count由窗口函数生成):
| Date | Source | Patient_ID | Status | Totals_Patients_Count | Unique_Patients_Count |
|---|---|---|---|---|---|
| 2023-09-25 | HAL | aaa23ef | TRUE | 47 | 30 |
| 2023-09-24 | DAL | aaa21ef | FALSE | 23 | 15 |
| 2023-09-23 | CCL | aaa20ef | TRUE | 20 | 10 |
遇到的问题与尝试方案
- 人工生成row_id方案失败:尝试过给stage表人工生成row_id,但每次重建stage表时row_id会重新生成,用
stg.row_id = tgt.row_id作为Merge匹配条件会导致计数错误。 - 当前方案:用Date+Patient_ID作为匹配键:移除人工row_id,改用
Date+Patient_ID作为Merge的匹配条件(Patient_ID本身唯一,且按日期筛选所有Patient_ID),对应的存储过程和任务调度代码如下:
存储过程代码
CREATE OR REPLACE PROCEDURE stg_to_target_merge() RETURNS VARCHAR LANGUAGE SQL AS BEGIN MERGE INTO target_table tgt USING (SELECT * FROM stage_table) AS src ON tgt.DATE = src.DATE AND tgt.patient_id = src.patient_ID WHEN MATCHED THEN DO NOTHING WHEN NOT MATCHED THEN INSERT (DATE, Source, Patient_ID, Status, Totals_Patients_Count, Unique_Patients_Count) VALUES (src.DATE, src.Source, src.Patient_ID, src.Status, src.Totals_Patients_Count, src.Unique_Patients_Count) RETURN 'Merge completed' END;
任务调度代码
CREATE OR REPLACE TASK tsk1 WAREHOUSE = 'custom_wh' SCHEDULE = 'custom cron schedule' AS CALL create_stg_tbl_proc(); CREATE OR REPLACE TASK tsk2 WAREHOUSE = 'custom_wh' AFTER tsk1 AS CALL stg_to_target_merge()
- 排除Dynamic Table:Snowflake的Dynamic Table特性不适用,因为使用JOIN逻辑时会触发全量截断,随着数据量增长会消耗更多计算资源且耗时显著增加。
现在需要确认这个方案是否可行,或者有没有更适配当前场景的优化方向?
内容的提问来源于stack exchange,提问作者John Jr.
相关产品推荐
相关产品推荐

