2012-06-04 103 views
3

我有一個包含事件表和結束日期如下 -如何獲得開始從結束日期的事件的日期和結束日期

Event_id Event_name  Event_end_date 
1   Name Change  31-Mar-2010  (prior to 31-Mar-2010) 
2   Parent change  31-Oct-2010  (Logically its duration is 1-Apr-2010 (31-Mar-2010 + 1(Day)) to 31-Oct-2010) 
3   Name Change  31-Jul-2011  (Logically its duration is 1-Nov-2010 (31-Oct-2010 + 1(Day)) to 31-Jul-2011) 

,所以我想如下編寫一個查詢,得到的結果 -

Event_id Event_name  Event_start_date Event_end_date 
1   Name Change  -    31-Mar-2010 
2   Parent change 1-Apr-2010   31-Oct-2010 
3   Name Change  1-Nov-2010   31-Jul-2011 

回答

2
SELECT event_id, event_name, 
    LAG (event_end_date) OVER (ORDER BY event_end_date ASC)+1 
                 event_start_date, 
    event_end_date 
FROM event 

enter image description here

+0

能否請你解釋LAG做(event_end_date + 1,1,NULL) OVER(ORDER BY event_end_date ASC NULLS LAST) event_start_date condi和 –

+0

如果我想按event_end_date降序排列,我需要做什麼? –

+0

'LAG'能夠計算前一行(即將在當前行之前出現的行)的表達式並將該值返回給當前行。在這裏我做了什麼,我根據end_date對行進行了排序升序排列,因此對於第一行,即'31/03/2010',沒有前一行,因此它將爲開始日期等設置爲空。請參閱我更新的答案# –

0

這可以通過使用自左外連接使用event_id來連接表來完成。

 select t1.Event_id ,t1.Event_name, coalesce(t2.Event_end_date,'-'), 
      t1.Event_end_date 
     from event_table t1 
       left outer join event_table t2 
     on t1.Event_id=t2.Event_id+1 

這在mysql中有效。也應該在oracle中工作。

2
select event_id, 
     event_name, 
     (lag(event_end_date) over (order by event_end_date)) + 1 as event_start_date, 
     event_end_date 
from event_table 
order by event_end_date desc 
+0

如果我想按event_end_date降序排列,我需要做什麼? –

+2

@PramodKumar:只需添加一個訂單(請參閱我的編輯) –

0

我會用正則表達式:)

select event_id, 
     event_name, 
     REGEXP_SUBSTR(comments, ' \d+-\w{3}-\d{4} ') as event_start_date, 
     to_char(event_end_date,'dd-MON-yyyy') 
from events 

http://sqlfiddle.com/#!4/fa1e5/16/0

+0

該表沒有這些評論,他們只是在那裏解釋Pramod的觀點 –

相關問題