sql - Teradata 加入 SCD 类型 2
问题描述
如何连接事务表和 SCD 表以根据事务日期从 SCD 获取记录。
Select A.id, A.trans_dt, trans_amt, B.pmt_meth
from trans1 A
left join scd1 B
on A.id=B.id
现在我需要为每笔交易获取 pmt_meth。所以前 2 个交易的 pmt_meth 应该是“M”,最后一个交易应该是“P”
由于加入问题,这正在创建重复项(我知道),但不确定如何匹配日期,以便不会创建重复项,我将获得所需的结果
create table scd1 (id integer, pmt_meth varchar (10), start_dt date, end_dt date)
Insert into scd1(1, P, '2015/06/30', '2017/05/30')
Insert into scd1(1, M, '2017/05/30', '2019/07/31')
Insert into scd1(1, P, '2019/07/31', '2050/12/31')
Create table trans1 (id integer, trans_dt date, trans_amt float)
Insert into trans1 (1, '2019/07/25', 100)
Insert into trans1 (1, '2019/07/01', 120)
Insert into trans1 (1, '2019/07/31', 50)
现在我需要为每笔交易获取 pmt_meth。所以前 2 个交易的 pmt_meth 应该是“M”,最后一个交易应该是“P”
Select A.id, A.trans_dt, trans_amt, B.pmt_meth
from trans1 A
left join scd1 B
on A.id=B.id
预期结果是
id trans_dt trans_amt pmt_meth
1 '2019/07/25' 100 M
1 '2019/07/01' 120 M
1 '2019/07/31' 50 P
解决方案
您的实现基于一个包含-排除间隔:
Select A.id, A.trans_dt, trans_amt, B.pmt_meth
from trans1 A
left join scd1 B
on A.id=B.id
and A.trans_dt >= B.start_dt
and A.trans_dt < B.end_dt
同样的逻辑也适用于 OVERLAPS 算子
Select A.id, A.trans_dt, trans_amt, B.pmt_meth
from trans1 A
left join scd1 B
on A.id=B.id
and (A.trans_dt, NULL) OVERLAPS (B.start_dt, B.end_dt)
顺便说一句,Teradata 支持临时表(在 Teradata 加上标准 SQL 语法中)以简化的方式实现 SCD2。
推荐阅读
- firebase - 安卓安全 | 恶意行为或用户数据政策 | androidx.fragment.app.FragmentActivity.startActivityForResult
- continuous-integration - 在 Tekton 中自动取消 PipelineRun(对于 PR)
- python-3.x - AttributeError:“PathDistribution”对象没有属性“名称”
- python - 如何在 Plotly 分组条形图中提取适当的数据?
- mongodb - Azure Cosmos MongoDB 似乎不使用索引
- reactjs - 如何禁用整个 VSCode 格式?
- react-native - 如何在本机基础项目中设置机器人介质。目前无法更改字体粗细
- c++ - c ++标头中的结构编码样式
- r - 在 R 中使用 sf 包中的 st_as_sfc 时出现错误“OGR:不支持的几何类型”
- sonos - Sonos SMAPI 在接收到 GET 上下文和 itemWindow 时无法开始播放 cloudQueue