Vous pouvez utiliser la fonction lead
pour regarder vers l'avenir à la ligne suivante et obtenir son entrée en vigueur:
select person_id, effective_date,
lead(effective_date)
over (partition by person_id order by effective_date) as lead_date
from t42;
PERSON_ID EFFECTIVE_DATE LEAD_DATE
---------- -------------- ---------
6335 26-JUN-98 09-JUL-98
6335 09-JUL-98 24-FEB-99
6335 24-FEB-99
Vous pouvez alors l'utiliser pour effectuer la mise à jour. La commande merge
rend ce assez facile:
merge into t42
using (
select person_id, effective_date,
lead(effective_date)
over (partition by person_id order by effective_date) as lead_date
from t42
) t
on (t42.person_id = t.person_id and t42.effective_date = t.effective_date)
when matched then
update set t42.end_effective_date =
case
when t.lead_date is null then date '9999-12-31'
else t.lead_date - 1
end;
3 rows merged.
select * from t42;
PERSON_ID EFFECTIVE_DATE END_EFFECTIVE_DATE
---------- -------------- ------------------
6335 26-JUN-98 08-JUL-98
6335 09-JUL-98 23-FEB-99
6335 24-FEB-99 31-DEC-99
La clause using
a l'extrait ci-dessus de faire la date de la ligne précédente. La clause on
correspond à la table d'origine. La ligne correspondante met à jour la date d'entrée en vigueur jusqu'au jour précédant la date d'entrée en vigueur, ou s'il n'y a pas de valeur principale (pour la ligne "actuelle" la plus récente). date à partir de 1999.
votre question fait référence à une mise à jour, mais si vous voulez juste la date de fin comme une colonne calculée dans votre jeu de résultats, il est beaucoup plus simple:
select person_id, effective_date,
case when lead_date is null then date '9999-12-31'
else lead_date - 1 end as end_effective_date
from (
select person_id, effective_date,
lead(effective_date)
over (partition by person_id order by effective_date) as lead_date
from t42
);
PERSON_ID EFFECTIVE_DATE END_EFFECTIVE_DATE
---------- -------------- ------------------
6335 26-JUN-98 08-JUL-98
6335 09-JUL-98 23-FEB-99
6335 24-FEB-99 31-DEC-99
ce qui est ur logique pour la fin efeectiveDate? –
Pouvez-vous nous s'il vous plaît ce que vous essayez de faire ici? – heretolearn
Salut, je viens de modifier ma question s'il vous plaît jeter un oeil 1er. Désolé pour ne pas avoir clarifié la question à ce sujet. – goh6319