Teradata自连接更新表字段:ABC.PERFORM_METRICS_F历史修正
基于INTERACTION_SOURCE_KEY修正ABC.PERFORM_METRICS_F表字段
需求说明
需针对ABC.PERFORM_METRICS_F表,按INTERACTION_SOURCE_KEY维度执行历史数据修正,更新CHAT_ACTIVITY_ID与CHAT_SMS_IND字段,规则如下:
- 若
CHAT_ACTIVITY_ID为NULL,使用相同INTERACTION_SOURCE_KEY下非NULL的CHAT_ACTIVITY_ID填充 - 将
CHAT_SMS_IND同步更新为对应非NULLCHAT_ACTIVITY_ID行的取值(例如INTERACTION_SOURCE_KEY=21945的NULL行需将CHAT_SMS_IND从0改为1)
该表主键为METRIC_SOURCE_KEY、METRIC_SOURCE、CALENDAR_DATE。
尝试的SQL语句
用户尝试编写自连接更新语句如下:
UPDATE A FROM (SEL * FROM ABC.PERFORM_METRICS_F WHERE CHAT_ACTIVITY_ID IS NULL) A, (SEL * FROM ABC.PERFORM_METRICS_F WHERE CHAT_ACTIVITY_ID IS NOT NULL) B SET CHAT_ACTIVITY_ID = B.CHAT_ACTIVITY_ID, CHAT_SMS_IND = B.CHAT_SMS_IND WHERE A.INTERACTION_SOURCE_KEY = B.INTERACTION_SOURCE_KEY AND A.INTERACTION_SOURCE_KEY IN ('21945','22045','22847');
样例数据与预期结果
| METRIC_SOURCE_KEY | METRIC_SOURCE | INTERACTION_SOURCE_KEY | CHAT_ACTIVITY_ID | CHAT_SMS_IND | CALENDAR_DATE | 预期结果说明 |
|---|---|---|---|---|---|---|
| 21945 | 3 | 21945 | 6534908765426 | 1 | 2022-05-29 | 无需修改 |
| 39827 | 4 | 21945 | NULL | 0 | 2022-05-30 | 填充CHAT_ACTIVITY_ID为6534908765426,CHAT_SMS_IND改为1 |
| 22045 | 3 | 22045 | 7345628390255 | 1 | 2022-06-15 | 无需修改 |
| 25430 | 2 | 22045 | NULL | 0 | 2022-06-17 | 填充CHAT_ACTIVITY_ID为7345628390255,CHAT_SMS_IND改为1 |
| 22847 | 3 | 22847 | 6427690875346 | 1 | 2022-06-06 | 无需修改 |
| 43216 | 4 | 22847 | NULL | 0 | 2022-06-06 | 填充CHAT_ACTIVITY_ID为6427690875346,CHAT_SMS_IND改为1 |
| 49567 | 2 | 22847 | NULL | 0 | 2022-06-07 | 填充CHAT_ACTIVITY_ID为6427690875346,CHAT_SMS_IND改为1 |
| 47289 | 2 | 22847 | NULL | 0 | 2022-06-06 | 填充CHAT_ACTIVITY_ID为6427690875346,CHAT_SMS_IND改为1 |
问题分析与优化方案
原语句存在潜在问题:若同一INTERACTION_SOURCE_KEY下有多条非NULLCHAT_ACTIVITY_ID的行,自连接会导致匹配到多条记录,可能引发更新冲突或重复更新。
优化后的SQL语句(Teradata适配)
先通过聚合获取每个INTERACTION_SOURCE_KEY对应的唯一有效字段值,再进行更新:
UPDATE ABC.PERFORM_METRICS_F FROM ( SELECT INTERACTION_SOURCE_KEY, MAX(CHAT_ACTIVITY_ID) AS CHAT_ACTIVITY_ID, -- 取非NULL值,若有多个取MAX(或根据实际业务选合适聚合) MAX(CHAT_SMS_IND) AS CHAT_SMS_IND FROM ABC.PERFORM_METRICS_F WHERE INTERACTION_SOURCE_KEY IN ('21945','22045','22847') GROUP BY INTERACTION_SOURCE_KEY ) AS src SET CHAT_ACTIVITY_ID = src.CHAT_ACTIVITY_ID, CHAT_SMS_IND = src.CHAT_SMS_IND WHERE ABC.PERFORM_METRICS_F.INTERACTION_SOURCE_KEY = src.INTERACTION_SOURCE_KEY AND ABC.PERFORM_METRICS_F.CHAT_ACTIVITY_ID IS NULL;
说明
- 聚合子查询确保每个
INTERACTION_SOURCE_KEY只返回一组有效字段值,避免多对多匹配问题 - 使用
MAX()聚合是因为非NULL值会被保留,若同一INTERACTION_SOURCE_KEY下的非NULL值都一致,聚合结果就是正确值;若存在不一致,需先确认业务规则选择合适的聚合方式(如MIN()、取最新日期对应值等) - 仅更新
CHAT_ACTIVITY_ID为NULL的行,符合需求且避免不必要的更新
内容的提问来源于stack exchange,提问作者Debasis Das
相关产品推荐
相关产品推荐

