You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Snowflake中创建无唯一ID的表Staging及Merge至目标表的任务/存储过程

无唯一行ID时Snowflake的Merge自动化去重方案问题

我需要实现Snowflake中的Merge自动化方案,核心要求是不依赖唯一行标识符,避免向目标聚合表插入重复值。具体场景如下:

需求说明

基于两张表的关联逻辑构建最终聚合表,要求随新数据到达持续追加。目前已通过视图验证聚合逻辑正确,思路是创建按日期分区的stage表,通过视图关联提取当日及前一日的数据(主表每日更新两次,确保无数据遗漏)。

Stage表示例

Stage表与目标表结构一致,记录指定日期的患者数据及统计值(Unique_Patients_Count由窗口函数生成):

DateSourcePatient_IDStatusTotals_Patients_CountUnique_Patients_Count
2023-09-25HALaaa23efTRUE4730
2023-09-24DALaaa21efFALSE2315
2023-09-23CCLaaa20efTRUE2010

遇到的问题与尝试方案

  1. 人工生成row_id方案失败:尝试过给stage表人工生成row_id,但每次重建stage表时row_id会重新生成,用stg.row_id = tgt.row_id作为Merge匹配条件会导致计数错误。
  2. 当前方案:用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()
  1. 排除Dynamic Table:Snowflake的Dynamic Table特性不适用,因为使用JOIN逻辑时会触发全量截断,随着数据量增长会消耗更多计算资源且耗时显著增加。

现在需要确认这个方案是否可行,或者有没有更适配当前场景的优化方向?


内容的提问来源于stack exchange,提问作者John Jr.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:53:10