首页/数据/数仓建模速查/维度历史点查:任意日期当时口径
维度与事实设计149 条

维度历史点查:任意日期当时口径

按「某天当时」的口径取维度属性,用生效区间过滤版本行;采用闭开区间 [start, end) 可避免生效日当天重复命中。

数仓建模速查数据更新于 2026-10-13

历史点查是什么

历史点查指按「某天当时」的口径取维度属性:用事实的业务时间落在版本生效区间内来关联版本行。区间必须用闭开写法(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 或单独处理当前行,否则最新版本永远匹配不上。

易错点

  • 用 BETWEEN 做区间关联:生效日当天命中两行,行数翻倍且金额翻倍
  • 事实存的是当前键却按历史口径分析:所有历史记录都取到最新属性,结论系统性偏移
  • 当前行 end_date 为 NULL 而关联条件没兜底:最新版本匹配不上,最近数据整片缺失
  • 区间存在重叠或断档:点查结果既可能重复也可能丢行,且不易察觉
  • 点查不建区间索引:大表按区间关联退化为全表扫描,查询超时

数据来源与参考

  • 数据仓库工具箱:拉链维度区间关联
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌