Teradata SQL单查询实现指定ID的start date批量填充需求
单查询实现Teradata中基于固定ID关联的Start Date填充
方法1:条件聚合(推荐,性能更优)
利用Teradata的窗口聚合函数在分组内提取目标ID的process_date,再通过CASE语句匹配规则填充start_date,无需多次自连接。
假设你的表名为your_table,包含字段:GP, Key1, Key2, Key3, ID, start_date, process_date,SQL语句如下:
SELECT GP, Key1, Key2, Key3, ID, CASE -- W004、W005取同组W003的process_date WHEN ID IN ('W004', 'W005') THEN MAX(CASE WHEN ID = 'W003' THEN process_date END) OVER (PARTITION BY GP, Key1, Key2, Key3) -- W0010、W0120、W0015、W0016取同组W005的process_date WHEN ID IN ('W0010', 'W0120', 'W0015', 'W0016') THEN MAX(CASE WHEN ID = 'W005' THEN process_date END) OVER (PARTITION BY GP, Key1, Key2, Key3) -- W345、W456取同组W234的process_date WHEN ID IN ('W345', 'W456') THEN MAX(CASE WHEN ID = 'W234' THEN process_date END) OVER (PARTITION BY GP, Key1, Key2, Key3) -- 其他ID保留原有start_date ELSE start_date END AS start_date, process_date FROM your_table;
说明:
MAX() OVER (PARTITION BY ...)窗口函数会在每个GP, Key1, Key2, Key3分组内,提取对应参考ID的process_date。由于分组内参考ID唯一,MAX、MIN、FIRST_VALUE效果一致,MAX兼容性更好。- 整个逻辑在单查询中完成,避免了多表自连接带来的性能损耗。
方法2:FIRST_VALUE窗口函数
如果需要明确取分组内参考ID的唯一值,可使用带IGNORE NULLS的FIRST_VALUE:
SELECT GP, Key1, Key2, Key3, ID, CASE WHEN ID IN ('W004', 'W005') THEN FIRST_VALUE(CASE WHEN ID = 'W003' THEN process_date END IGNORE NULLS) OVER (PARTITION BY GP, Key1, Key2, Key3 ORDER BY ID) WHEN ID IN ('W0010', 'W0120', 'W0015', 'W0016') THEN FIRST_VALUE(CASE WHEN ID = 'W005' THEN process_date END IGNORE NULLS) OVER (PARTITION BY GP, Key1, Key2, Key3 ORDER BY ID) WHEN ID IN ('W345', 'W456') THEN FIRST_VALUE(CASE WHEN ID = 'W234' THEN process_date END IGNORE NULLS) OVER (PARTITION BY GP, Key1, Key2, Key3 ORDER BY ID) ELSE start_date END AS start_date, process_date FROM your_table;
说明:
IGNORE NULLS确保跳过分组内非参考ID的NULL值,直接定位到目标ID的process_date。ORDER BY ID可根据实际数据调整排序规则,保证取到正确的参考记录。
注意事项
- 需确保每个
GP, Key1, Key2, Key3分组内,参考ID(如W003、W005、W234)存在且唯一,否则聚合函数会返回多条记录的聚合结果(如MAX会取最大日期)。 - 若参考ID可能缺失,可在CASE中添加
COALESCE处理空值,例如:COALESCE(MAX(...), start_date),避免填充为NULL。
内容的提问来源于stack exchange,提问作者GIN
相关产品推荐
相关产品推荐

