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/