我有一张表A
ID EFF_DT
1 2/12/2013
2 4/12/2013
3 6/3/2013
4 5/15/2013
我需要一个临时表#temp as
ID EFF_DT END_DATE
1 2/12/2013 4/11/2013
2 4/12/2013 5/14/2013
3 5/15/2013 6/2/2013
4 6/3/2013 cURRDATE
实现这一目标的最佳方法是什么? EFF_DT的END_DATE按排序顺序比下一个EFF_DT小1天
答案 0 :(得分:1)
您可以使用相关子查询(在任何查询引擎中)执行此操作:
select a.*,
coalesce((select min(efe_dt) + 1
from a a2
where a2.efe_dt > a.efe_dt
), CURRENT_DATE) as end_date
from a;
一些警告,基于SQL的方言。减去一天的代码可以采用各种格式(例如使用dateadd()
函数)。当前日期时间的常数/功能也因方言而异。
某些SQL引擎支持ANSI标准lag()
/ lead()
函数。这使代码更容易。以下是在SQL Server 2012中执行此操作的方法:
select a.*,
coalesce(dateadd(day, -1, lead(efe_dt) over (order by efe_dt)),
cast(get_date() as date)
) as end_date
from a;
答案 1 :(得分:0)
Freehand SQL:
select a1.I2, a1.eff_date, case when a2.eff_date is null then getdate()
else DateAdd(D, -1, a2.eff_date) end End_date
from A a1
left outer join A a2 on a2.eff_date > a1.eff_date
where a2.eff_date is null
or a2.eff_date = (select min(a3.eff_date) from A a3 where a3.eff_date > a1.eff_date)
看起来很有效。