Я хочу обновить и вставить записи в таблицу фактов.Есть некоторые условия.
1) Мне нужно обновить строку записи при изменении записи в тот же день
2) и вставить, когда запись изменяется на другую дату (Date_Import).
Но на данный момент я думаю, что проблема в левом соединении.Когда я запускаю код, он обновляет все записи, а не только хорошие.
Таблица: факты
Fact_Key Date_Import Date_of_Work WorkshopID WorkforceNeeded
----------- ----------- ------------ ----------- ---------------
1 20190425 20190501 2 220
2 20190425 20190501 3 40
3 20190425 20190504 2 6
4 20190425 20190504 3 35
Таблица: подготовка
Date_Import Date_of_Work WorkshopId WorkforceNeeded
----------- ------------ ----------- ---------------
20190425 20190501 2 185
20190426 20190501 3 68
20190425 20190504 2 6
20190425 20190504 3 35
Ожидаемый результат
Fact_Key Date_Import Date_of_Work WorkshopID WorkforceNeeded
----------- ----------- ------------ ----------- ---------------
1 20190425 20190501 2 185 -- updated
2 20190425 20190501 3 40
3 20190425 20190504 2 6
4 20190425 20190504 3 35
5 20190426 20190501 3 68 -- inserted
РЕДАКТИРОВАНИЕ:
ФактРезультат, если я выполню код с этими двумя таблицами:
Fact_Key Date_Import Date_of_Work WorkshopID WorkforceNeeded
----------- ----------- ------------ ----------- ---------------
1 20190425 20190501 2 185
2 20190425 20190501 2 185
3 20190425 20190501 2 185
4 20190425 20190501 2 185
5 20190425 20190501 3 40
6 20190425 20190504 2 6
7 20190425 20190504 3 35
Код, который не работает полностью
----------------------------------------------------------------------
-- UPDATE (first because we update only record already in the table)
----------------------------------------------------------------------
begin
update DWH.Fact
set
-- Colonne Business
[Date_Import] = GETDATE(),
[WorshopId] = S.WorkshopId,
[Date_of_Work] = convert(int, convert(char(8), Convert(Date,S.Date_of_Work), 112)),
[WorkforceNeeded] = Convert(int,S.WorkforceNeeded)
FROM Staging S
left outer join
(
SELECT *
FROM (
SELECT *
,RANK() OVER (PARTITION BY F.[WorkshopId], F.[Date_of_Work] ORDER BY F.[Date_Import] DESC) AS Ranking
FROM DWH.Fact F
) Inter
WHERE Ranking = 1
)BA
on BA.WorkshopId = S.WorkshopId and BA.Date_of_Work = S.Date_of_Work
where BA.Fact_KEY is not null
and BA.WorkforceNeeded != convert(int,S.WorkforceNeeded)
and BA.Date_Import = GETDATE()
end
----------------------------------------------------------------------
-- INSERT
----------------------------------------------------------------------
begin
insert into DWH.Fact(
[WorkshopId]
,[Date_Import]
,[Date_of_Work]
,[WorkforceNeeded])
Select
ISNULL(A.WorkshopId,-1) as WorkshopId,
GETDATE() Date_Import,
S.Date_of_Work as [Date_of_Work],
Convert(int,S.WorkforceNeeded) as WorkforceNeeded
from Staging S
left outer join
(
SELECT *
FROM (
SELECT *
,RANK() OVER (PARTITION BY F.[WorkshopId], F.[Date_of_Work] ORDER BY F.[Date_Import] DESC) AS Ranking
FROM DWH.Fact F
) Inter
WHERE Ranking = 1
)BA
on BA.WorkshopId = S.WorkshopId and BA.Date_of_Work = S.Date_of_Work
where
(
BA.Fact_KEY is null
)
OR
(
BA.Fact_KEY is not null
and BA.Date_Import != GETDATE()
and BA.WorkforceNeeded != convert(int,S.WorkforceNeeded)
)
end
Отредактированный пример.