我正在尝试通过T-SQL实现Slowly Changing Dimension Type 2,但我无法弄清楚如何处理请求。
表格列:cpf
,nome
,telefone_update
,endereco_insert
基本上逻辑是:如果使用MATCH
cpf
不发生,则必须插入记录;如果MATCH
发生但只有telefone_update
字段发生了变化,则不需要另一条记录,我只想更新并覆盖这些值;如果MATCH
发生但只有endereco_insert
字段发生了变化,我想添加新记录并更新开始日期和结束日期。
到目前为止我所拥有的是:
insert into #dm_lucas_tst (
[cpf],
[nome],
[telefone_update],
[endereco_insert],
[dt_scd_start],
[dt_scd_end],
[nu_scd_version]
)
select [cpf],
[nome],
[telefone_update],
[endereco_insert],
cast(dateadd(month, datediff(month, 0, getdate()), 0) as date) as [dt_scd_start],
'2199-12-31' AS [dt_scd_end],
1 AS [nu_scd_version]
from (
merge edw.dim.dm_lucas_tst as Target
using edw.dim.stg_lucas_tst as Source
on Target.cpf = Source.cpf
when not matched by target
then
insert (
[cpf],
[nome],
[telefone_update],
[endereco_insert],
[dt_scd_start],
[dt_scd_end],
[nu_scd_version]
)
values (
Source.[cpf],
Source.[nome],
Source.[telefone_update],
Source.[endereco_insert],
cast(dateadd(month, datediff(month, 0, getdate()), 0) as date),
'2199-12-31',
1
)
when matched
and Source.telefone_update <> Target.telefone_update
and Target.dt_scd_end = '2199-12-31'
then
update set telefone_update = Source.telefone_update
output $ACTION ActionOut,
Source.[cpf],
Source.[nome],
Source.[telefone_update],
Source.[endereco_insert]
) AS MergeOut
where MergeOut.ActionOut = 'UPDATE';
但我不认为放另一个WHEN MATCH AND ...
会使这项工作成功。
有什么建议吗?
提前致谢!
答案 0 :(得分:0)
根据您的描述,我假设您需要:
我已经使用应用 SCD合并向导来轻松创建所描述的逻辑。 当我为它做测试时 - 我想,一切看起来都像预期的那样。 我在博客上描述了这个过程 - 请看看并告诉我这是不是你想要的?
https://sqlplayer.net/2018/01/scd-type-1-type-2-in-merge-statement/