У меня много неточных записей;аналитик загрузил данные без обработки, поэтому в этой базе данных у меня есть много перекрывающихся дат между строками в INI
и FIN
, например:
valido ID id_tip id_hr perpro rut ini fin ult_act
------ --- ------ ----- --------- ---------- ------------------------- ----------------------- ----------------------
1 52 001 666 201802 6666666-6 2018-05-01 00:00:00.000 2018-05-10 00:00:00.000 2018-09-12 00:00:00.000
1 53 001 666 201802 6666666-6 2018-05-09 00:00:00.000 2018-05-12 00:00:00.000 2018-09-13 00:00:00.000
Для этого я хочу создать CTE / StoredПроцедура, которая отображает обе записи : ту, которая перекрыта, и ту, с которой она перекрывается.Затем обновите самый старый на основе ULT_ACT
, который является отметкой времени, когда он был загружен.Мой текущий выбор может распечатать более старую запись, которая перекрывается с новой, и те, которые имеют совпадающие даты INI2
и FIN1
:
SELECT ROW_NUMBER() OVER (PARTITION BY ID_HR ORDER BY ULT_ACT ASC) AS IDOR,
T.ID,
T.RUT,
CONVERT(VARCHAR,T.INI,112) AS INI,
CONVERT(VARCHAR,T.FIN,112) AS FIN,
CONVERT(VARCHAR,T.ULT_ACT,112) AS ULT_ACT
FROM TSTSOLAP t
WHERE EXISTS
(
SELECT 1 FROM TSTSOLAP T2
WHERE t.RUT = t2.RUT AND
T.ID_TIP = T2.ID_TIP AND
T.ID <> t2.ID AND
(T2.INI BETWEEN T.INI AND T.FIN)
OR T2.INI = T.FIN
--T2.INI < T.FIN OR
--T2.INI = T.FIN
--OR t.INI <= t2.FIN
)
ORDER BY ID
--UPDATE I WANT TO IMPLEMENT, IT CHANGES FIN AND SETS IT TO T2.INI - 1 SO IT REMOVES THE OVERLAPPED CONDITION
--UPDATE TSTSOLAP SET T.FIN=INI-1 WHERE IDOR > 1
Который печатает это:
valido ID id_tip id_hr perpro rut ini fin ult_act
------ --- ------ ----- --------- ---------- ------------------------- ----------------------- ----------------------
1 52 001 666 201802 6666666-6 2018-05-01 00:00:00.000 2018-05-10 00:00:00.000 2018-09-12 00:00:00.000
Мне нужна помощь в печати обоих случаев и реализации обновления более "исполняемым" способом.