SQL表列填充

时间:2013-12-18 14:39:40

标签: sql

我有一张表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天

2 个答案:

答案 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)

看起来很有效。