1

我正在尝试通过 T-SQL 实现缓慢变化的维度类型 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 ...不会使这项工作。

有什么建议么?

提前致谢!

4

1 回答 1

0

根据您的描述,我假设您需要:

  • 列 [telefone_update] 的 SCD 类型 1
  • 列 [endereco_insert] 的 SCD 类型 2

我使用应用程序SCD 合并向导轻松创建描述的逻辑。当我对其进行测试时 - 我猜一切看起来都符合预期。我在我的博客上描述了这个过程 - 请看看并告诉我这是否正是你想要的?

https://sqlplayer.net/2018/01/scd-type-1-type-2-in-merge-statement/

于 2018-01-30T11:16:20.640 回答