Slowly Changing Dimension Type 2をT-SQLで実装しようとしていますが、要求をどのように処理するかを理解できません。SQL Server - 緩やかに変化するディメンションに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 ...
を置くとは思わない:
は、私がこれまで持っていることです。
提案がありますか?
ありがとうございます!
あなたの説明にしたがって
こんにちは@Lucas、この問題を解決しましたか? –
@KamilNowinskiは本当にありません。私は上に移動し、新しい行を挿入することを決めました。 –
こんにちは@Lucas、私が下で提示した解決策は助けになるでしょうか? –