SQL Server - Как использовать оператор слияния для медленного изменения измерения с более чем двумя условиями?

Я пытаюсь реализовать медленно изменяющийся тип 2 с помощью T-SQL, но не могу понять, как заставить запрос работать.

Столбцы таблицы: 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 ... сделает эту работу.

Какие-либо предложения?

Заранее спасибо!

1 ответ

В соответствии с вашим описанием, я предполагаю, что вам нужно:

  • Тип SCD 1 для столбца [telefone_update]
  • Тип SCD 2 для столбца [endereco_insert]

Я использовал приложение SCD Merge Wizard, чтобы легко создавать описанную логику. Когда я делал тесты для этого - я думаю, все выглядит как положено. Я описал процесс в своем блоге - пожалуйста, посмотрите и скажите мне, было ли это именно то, что вы хотели?

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

Другие вопросы по тегам