SQL如何按时间区间条件关联多版本数据表与呼叫表获取匹配文本
多版本Fid表与呼叫记录表关联查询方案
表结构说明
表1(t1:带版本的Fid信息表)
存储Fid的各版本生效/失效时间及对应文本,示例数据如下:
Fid start_dt end_dt text 1 2021-09-01 00:00:00 2021-10-09 23:59:59 first_row 1 2021-10-10 00:00:00 2999-12-12 23:59:59 second_row 2 2021-10-02 00:00:00 2999-12-12 23:59:59 third_row 3 2021-09-05 00:00:00 2021-09-06 23:59:59 fourth_row 3 2021-09-07 00:00:00 2999-12-12 23:59:59 fifth_row
表2(t2:呼叫记录表)
存储每通呼叫的时间及关联Fid,示例数据如下:
id dt Fid 1 2021-09-01 05:00:00 1 2 2021-10-01 18:00:00 2 3 2021-10-11 05:00:00 1 4 2021-10-01 16:50:00 2
查询需求
关联两张表,按呼叫时间匹配对应Fid生效版本的text字段,期望输出结果:
id text 1 first_row 2 third_row 3 second_row 4 third_row
解答
你当前正在使用的关联SQL 本身就是已经适配单/多版本Fid场景的统一实现方案,不需要额外新增版本标记等复杂逻辑,核心逻辑验证如下:
- 这套关联逻辑的判断规则只和Fid匹配、时间区间校验有关,和单个Fid下的版本数量无关:只要t1是标准的无重叠、无间隙拉链表设计,不管每个Fid有1个还是N个版本,每次关联只会匹配到唯一符合时间要求的行,完全不会出现多匹配的问题,天然覆盖所有场景。
- 若要进一步提升查询性能,可以在t1上创建
(Fid, start_dt, end_dt)联合索引,能大幅降低关联匹配的耗时。 - 如果存在部分Fid的最新版本未设置
end_dt为远时间、而是留空的特殊场景,只需要把关联条件调整为t2.dt >= t1.start_dt and (t2.dt <= t1.end_dt or t1.end_dt is null)即可,依然可以统一适配所有版本数量的场景。
内容的提问来源于stack exchange,提问作者user458
相关产品推荐
相关产品推荐

