SQL Server - 如何使用合并语句来缓慢更改多个条件的维度?

时间:2017-01-23 14:01:15

标签: sql-server tsql scd scd2

我正在尝试通过T-SQL实现Slowly Changing Dimension Type 2,但我无法弄清楚如何处理请求。

表格列:cpfnometelefone_updateendereco_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 ...会使这项工作成功。

有什么建议吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

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

我已经使用应用 SCD合并向导来轻松创建所描述的逻辑。 当我为它做测试时 - 我想,一切看起来都像预期的那样。 我在博客上描述了这个过程 - 请看看并告诉我这是不是你想要的?

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