基于SQL的Data Vault中LINK与SAT表历史关联分析问询
解决方案
一、历史数据全关联分析
要实现LINK与SAT的历史关联,核心是为每条LINK_Tradein记录匹配其创建时间点或之前最新的SAT_Order记录(因为LINK仅在车辆关联变更时插入,SAT仅在订单属性变更时插入,两者时间线独立但需对齐)。
以下查询无需在WHERE中指定具体creationdate值,完全通过窗口函数实现关联:
WITH ranked_sat AS ( SELECT orderkey, orderhash, orderamt, agentemployee, creationdate, -- 按订单分组,按创建时间倒序排名,每条SAT记录的最新版本排在最前 ROW_NUMBER() OVER (PARTITION BY orderkey ORDER BY creationdate DESC) AS sat_rank FROM SAT_Order ), link_with_sat_match AS ( SELECT l.ordervehiclekey, l.orderkey, l.vehiclekey, l.creationdate AS link_creationdate, s.orderhash, s.orderamt, s.agentemployee, s.creationdate AS sat_creationdate, -- 为每条LINK记录匹配到的SAT记录按时间倒序排名,取最接近LINK创建时间的那条 ROW_NUMBER() OVER (PARTITION BY l.ordervehiclekey, l.creationdate ORDER BY s.creationdate DESC) AS match_rank FROM LINK_Tradein l JOIN ranked_sat s ON l.orderkey = s.orderkey AND s.creationdate <= l.creationdate ) SELECT ordervehiclekey, orderkey, vehiclekey, link_creationdate, orderhash, orderamt, agentemployee, sat_creationdate FROM link_with_sat_match WHERE match_rank = 1;
逻辑说明
- 先对
SAT_Order按订单分组并按时间倒序排名,确保每个订单的历史版本按时间从新到旧排列; - 将
LINK_Tradein与符合时间条件(SAT创建时间不晚于LINK创建时间)的SAT记录关联; - 对每个LINK记录匹配到的SAT记录再次按时间倒序排名,取排名为1的记录,即该LINK记录对应时间点的最新订单属性。
二、获取指定orderkey与vehiclekey组合的最新记录
要获取指定组合的最新状态,先定位LINK中该组合的最新版本,再匹配对应时间点的最新SAT记录:
WITH latest_link AS ( SELECT ordervehiclekey, orderkey, vehiclekey, creationdate AS link_latest_date, ROW_NUMBER() OVER (PARTITION BY orderkey, vehiclekey ORDER BY creationdate DESC) AS link_rank FROM LINK_Tradein ), latest_sat_for_order AS ( SELECT orderkey, orderhash, orderamt, agentemployee, creationdate AS sat_latest_date, ROW_NUMBER() OVER (PARTITION BY orderkey ORDER BY creationdate DESC) AS sat_rank FROM SAT_Order ) SELECT ll.ordervehiclekey, ll.orderkey, ll.vehiclekey, ll.link_latest_date, ls.orderhash, ls.orderamt, ls.agentemployee, ls.sat_latest_date FROM latest_link ll JOIN latest_sat_for_order ls ON ll.orderkey = ls.orderkey AND ls.sat_latest_date <= ll.link_latest_date WHERE ll.link_rank = 1 ORDER BY ls.sat_latest_date DESC LIMIT 1;
逻辑说明
- 筛选出每个
orderkey+vehiclekey组合的最新LINK记录(link_rank=1); - 筛选出该订单的所有SAT记录,找到不晚于LINK最新时间的最新SAT记录(通过
ORDER BY和LIMIT 1实现,无需指定具体日期条件)。
关键注意点
- 全程未在
WHERE中使用具体creationdate值作为过滤条件,符合需求要求; - 避免了将SAT的
orderhash同步到LINK表的冗余问题,完全通过查询逻辑实现关联; - 利用窗口函数
ROW_NUMBER()处理版本排序,贴合Data Vault模型的历史版本化存储特性。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

