历史点查是什么
历史点查指按「某天当时」的口径取维度属性:用事实的业务时间落在版本生效区间内来关联版本行。区间必须用闭开写法(start_date 含、end_date 不含)或等价的严格不等式,否则生效日当天会同时命中前后两个版本,行数直接翻倍。事实表通常已固化当时的代理键,点查主要服务于事后修正、审计比对与迟到数据回刷。
基本信息
| 区间写法 | start_date 含、end_date 不含,即闭开区间 |
|---|---|
| 关联列 | 事实的业务时间落在版本生效区间内 |
| 适用场景 | 审计回溯、历史修正、回刷核对 |
| 性能要点 | 按自然键与区间建索引,避免全表扫描 |
| 前提条件 | 版本区间连续且不重叠,当前行用远期 end_date |
典型使用场景
- 迟到数据回刷:事实晚到,需按业务时间取当时而不是当前的维度属性
- 审计回溯:监管问「那天这笔业务按什么等级计算」,需精确还原
- 历史修正:发现某成员版本区间错误,重算后核对受影响事实
- 口径验证:对比固化代理键与按区间点查的结果,验证事实加载是否正确
- 追溯报告:给业务方提供按发生时间还原的明细
- 跨系统对账:对方按当时口径出数,本侧需同样口径才能核对
按发生时间关联版本
按发生时间关联版本
-- 推荐:闭开区间,生效日当天只命中一行
SELECT o.order_id, c.tier
FROM fact_order o
JOIN dim_customer c
ON o.customer_id = c.customer_id
AND o.dt >= c.start_date -- 含起始日
AND o.dt < c.end_date; -- 不含结束日,避免当天命中两行
-- 校验:点查结果与事实固化的代理键是否一致
SELECT count(1) AS mismatch
FROM fact_order o
JOIN dim_customer c
ON o.customer_id = c.customer_id
AND o.dt >= c.start_date AND o.dt < c.end_date
WHERE c.customer_sk <> o.customer_sk; -- 有结果说明事实加载时取错了版本区间写法对照
| 写法 | 结果 |
|---|---|
| dt >= start AND dt < end | 闭开区间,正确,生效日只命中一行 |
| dt BETWEEN start AND end | 闭区间,生效日当天命中两行,行数翻倍 |
| dt > start AND dt <= end | 左开右闭,若区间按日闭合也会重复命中 |
| 只按自然键关联 | 取到全部版本行,需额外去重且无口径保障 |
| 按当前标志关联 | 取的是当前口径,历史分析会全部取到最新属性 |
区间是否闭合必须与生成逻辑一致:若生成版本时把当前行的 end_date 写成 9999-12-31,点查用闭开区间刚好正确;若写成 NULL 表示当前行,则需在关联里补 coalesce 或单独处理当前行,否则最新版本永远匹配不上。