Snowflake环境下产品数据复制及去重插入的SQL需求
Snowflake 下实现Table_P表的两类数据插入(新增Product_Y+去重补充Product_W)
一、新增Product_Y,完整复制Product_X对应数据
该操作是新增全新产品条目,无需去重,直接复制Product_X的所有记录并替换Product字段即可:
INSERT INTO Table_P (PRODUCT, REGION, SALESPERSON, PROD_DATE, END_DATE) SELECT 'PRODUCT_Y', REGION, SALESPERSON, PROD_DATE, END_DATE FROM Table_P WHERE PRODUCT = 'PRODUCT_X';
如果需要和Product_W的日期逻辑一致(用当前时间+固定结束日期),可将PROD_DATE和END_DATE替换为SYSDATE()和TO_DATE('31-12-9999', 'DD-MM-YYYY'),按需调整即可。
二、为Product_W去重补充数据
原INSERT语句产生重复的核心原因是未过滤已存在的Product_W记录。以下提供两种适配Snowflake的去重方案,默认以(PRODUCT, REGION, SALESPERSON)作为重复判定组合,可根据业务需求调整匹配字段。
方案1:WHERE NOT EXISTS过滤重复
INSERT INTO Table_P (PRODUCT, REGION, SALESPERSON, PROD_DATE, END_DATE) SELECT 'PRODUCT_W', t.REGION, t.SALESPERSON, SYSDATE(), TO_DATE('31-12-9999', 'DD-MM-YYYY') FROM Table_P t WHERE t.PRODUCT = 'PRODUCT_X' AND NOT EXISTS ( SELECT 1 FROM Table_P WHERE PRODUCT = 'PRODUCT_W' AND REGION = t.REGION AND SALESPERSON = t.SALESPERSON );
逻辑说明:先提取Product_X的所有记录,再检查Table_P中是否已存在相同区域、销售的Product_W记录,仅插入不存在的条目。
方案2:MERGE语句(Snowflake推荐)
MERGE可灵活实现“存在则跳过、不存在则插入”的批量逻辑:
MERGE INTO Table_P AS target USING ( SELECT 'PRODUCT_W' AS PRODUCT, REGION, SALESPERSON, SYSDATE() AS PROD_DATE, TO_DATE('31-12-9999', 'DD-MM-YYYY') AS END_DATE FROM Table_P WHERE PRODUCT = 'PRODUCT_X' ) AS source ON target.PRODUCT = source.PRODUCT AND target.REGION = source.REGION AND target.SALESPERSON = source.SALESPERSON WHEN NOT MATCHED THEN INSERT (PRODUCT, REGION, SALESPERSON, PROD_DATE, END_DATE) VALUES (source.PRODUCT, source.REGION, source.SALESPERSON, source.PROD_DATE, source.END_DATE);
注意事项
- 若需要调整重复判定规则,修改ON子句中的匹配字段即可。
- Snowflake中
SYSDATE()返回当前会话时间,如需UTC时间可替换为CURRENT_TIMESTAMP()。 - 执行写入操作前,可将INSERT/MERGE替换为SELECT语句预览数据,确认无误后再执行。
内容的提问来源于stack exchange,提问作者Stephen Adair
相关产品推荐
相关产品推荐

