Une solution basée sur l'assemblage et le regroupement des données connexes. Ces jours-ci, j'utilise souvent des CTE, mais avant qu'ils ne soient populaires, il aurait fallu envisager d'utiliser quelque chose comme ça.
select *
into ##test1
from
(
select ID = 1, CLT_NBR = 12375, IS_PRIMARY = 1, EFFECT_DATE = cast('8/13/2015' as date), END_DATE = cast('9/30/2015' as date)
union all select ID = 2, CLT_NBR = 12375, IS_PRIMARY = 1, EFFECT_DATE = cast('10/1/2015' as date), END_DATE = cast('12/31/9998' as date)
union all select ID = 3, CLT_NBR = 12375, IS_PRIMARY = 1, EFFECT_DATE = cast('7/18/2017' as date), END_DATE = cast('12/31/9998' as date)
union all select ID = 4, CLT_NBR = 12331, IS_PRIMARY = 1, EFFECT_DATE = cast('2/3/2016' as date), END_DATE = cast('7/8/2016' as date)
union all select ID = 5, CLT_NBR = 12331, IS_PRIMARY = 1, EFFECT_DATE = cast('7/9/2016' as date), END_DATE = cast('12/31/9998' as date)
) x
select * from ##test1
select t.ID, t.CLT_NBR, t.IS_PRIMARY, t.EFFECT_DATE, END_DATE = isnull(dateadd(day,-1,min(t_next.EFFECT_DATE)),'9998-12-31')
from ##test1 t
left join ##test1 t_next on t_next.CLT_NBR = t.CLT_NBR and t_next.effect_date > t.effect_date
group by t.ID, t.CLT_NBR, t.IS_PRIMARY, t.EFFECT_DATE
update t
set END_DATE = helper.END_DATE
from ##test1 t
left join
(
select t.ID, t.CLT_NBR, t.IS_PRIMARY, t.EFFECT_DATE, END_DATE = isnull(dateadd(day,-1,min(t_next.EFFECT_DATE)),'9998-12-31')
from ##test1 t
left join ##test1 t_next on t_next.CLT_NBR = t.CLT_NBR and t_next.effect_date > t.effect_date
group by t.ID, t.CLT_NBR, t.IS_PRIMARY, t.EFFECT_DATE
) helper on helper.id = t.id
select * from ##test1
drop table ##test1
Pourquoi ne pas laisser tomber la colonne de END_DATE et de calculer à l'aide d'une cte récursive lorsque vous interrogez les données? –
vous devriez voir ma réponse pour sql 2008 conforme version – DhruvJoshi
@SeanLange - autant que je voudrais recommander cela aussi (ou quelque chose avec 'LEAD()'), ces requêtes peuvent consommer beaucoup de ressources. Comme ces données sont souvent assez statiques, il est généralement préférable de mettre en cache la date de fin, bien qu'il soit possible d'en faire une colonne calculée. Cela dit, je recommande absolument d'en faire une borne supérieure ** ** ("<"), de sorte que l'interroger ne se heurte pas à des situations amusantes avec des conversions de type (c.-à-d. comme date d'entrée en vigueur de la ligne suivante). –