基礎上加入和將相關數據的解決方案。現在我經常使用CTE,但在它們很受歡迎之前,我們不得不考慮使用這樣的東西。
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
爲什麼不降END_DATE列和使用遞歸CTE在查詢計算它數據? –
你應該看到我的答案爲sql 2008兼容版本 – DhruvJoshi
@SeanLange - 儘可能多地我也推薦這個(或者用'LEAD()')的東西,那些查詢會消耗大量資源。由於這些數據通常相當靜態,所以緩存結束日期通常會更好,儘管可以將其計算爲列。也就是說,我絕對建議將它作爲**獨佔**('<')上限,以便查詢它不會遇到類型轉換的有趣情況(即非最大值結束日期應該相同作爲下一行的生效日期)。 –