2013-12-18 121 views
-2

我有一個表A作爲SQL表列填充

ID EFF_DT 
1 2/12/2013 
2 4/12/2013 
3 6/3/2013 
4 5/15/2013 

我需要一個臨時表#TEMP作爲

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 

什麼是實現這一目標的最佳途徑? END_DATE爲EFF_DT比下一EFF_DT少的順序排序

+0

有人可以調整列格式pls – user3083816

+0

對不起,忽略ID列..它不重要 – user3083816

+0

你試過什麼代碼,你的結果是什麼? – Theresa

回答

1

的第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; 
+0

非常好!我從來沒有見過領先。然而,它錯過了系列中的最後一天 - 它必須在封面下面做一個自我內在聯結? –

+0

只是要說清楚,這只是你第二個錯過了最後一行。你的第一個很好,比我的快得多。 –

+0

@simonatrcl。 。 。你是什​​麼意思「錯過最後一行」?第二個查詢是從'a'選擇所有行,所以不應該丟失行。 –

0

寫意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) 

看起來像它的工作原理。