Snowflake中合并两张不同表并按时间戳排序的SQL实现方法
Snowflake 双表按时间戳全局合并排序实现方案
问题根源
你之前用左连接、全外连接拿不到正确结果,本质是搞反了操作逻辑:这个需求是要把两张表的记录纵向堆在一起,不是按某个键把两边的行横向拼起来。
JOIN类操作天生是做横向匹配的:你拿LDTS当关联键,数据库自然会把两边的LDTS合并成一列,只有键值能匹配上的行才会拼到一起,剩下的行要么空值要么重复,和你要的效果完全不搭边。
实现步骤
- 字段对齐:分别查询两张表,将单表不存在的目标字段填充为对应类型的NULL值,把两张表的查询结果统一为
PERSON_ID、T1_LDTS、T2_LDTS、CURRENCY的4字段结构 - 纵向合并:使用
UNION ALL拼接两个结构一致的查询结果,不要用UNION避免不必要的全局去重开销 - 全局排序:取每行非空的时间戳作为排序键,按时间先后排序即可
可直接运行的示例代码
SELECT PERSON_ID, LDTS AS T1_LDTS, NULL::TIMESTAMP AS T2_LDTS, -- 类型替换为实际LDTS字段的类型,如TIMESTAMP_TZ/TIMESTAMP_LTZ NULL::VARCHAR AS CURRENCY -- 类型替换为实际CURRENCY字段的类型,如CHAR(3) FROM TABLE_1 UNION ALL SELECT PERSON_ID, NULL::TIMESTAMP AS T1_LDTS, -- 类型和上面的T1_LDTS保持一致 LDTS AS T2_LDTS, CURRENCY FROM TABLE_2 -- 取第一个非空的时间戳作为排序依据,ASC为正序,需要倒序就改成DESC ORDER BY COALESCE(T1_LDTS, T2_LDTS) ASC;
注意事项
- 代码中NULL值的强转类型必须和业务表实际字段类型匹配,否则会抛出类型不兼容报错
- 如果需要溯源每条记录的来源,可以在两个子查询中新增
RECORD_SOURCE字段,分别标记为'TABLE_1'、'TABLE_2'即可 - 不要尝试用任何JOIN逻辑实现该需求:JOIN的核心是按键值横向匹配行,只有当两张表存在
PERSON_ID+LDTS完全一致的记录时才会合并到同一行,无法实现全量记录按时间堆叠的效果
内容的提问来源于stack exchange,提问作者user18466310
相关产品推荐
相关产品推荐

