2013-06-24 118 views
0
Row No. Start Date End Date 
1 28/11/2012   28/11/2012 
2 28/11/2012   6/12/2012 
3 6/12/2012    6/12/2012 
4 22/01/2013   23/01/2013 
5 23/01/2013 

我已經基於上述樣本數據下面兩個查詢: -日期計算SQL(Oracle)的

  1. SQL帶來記錄,其中有在日期沒有連續性(對於如rrecord 3。結束對 2012年6月12日,但創紀錄的4點開始在22/01/2013)

  2. 調整那裏是在日期沒有連續性的日期(如更新記錄的開始日期 4-6/12/12做出連續性)

在此先感謝 哈利

+2

那麼問題是什麼? –

+0

所以基本上我認爲他希望查詢檢查前一個記錄的END DATE是否等於下一個記錄START DATE。如果不是,則返回該記錄(請求#1)。然後將START DATE更新爲與之前的END DATE(請求#2)相同。 –

+0

@Radu Gheorghiu現貨。這就是我正在尋找的。 – Harry

回答

1

您可以使用lag function來回引用前一行的值(定義'previous'是什麼意思作爲查詢的一部分;我假設您的'行號'是僞列,而不是實際的列可以通過訂購,並希望他們在開始日期順序排列):

select start_date, end_date, 
    case 
    when lag_end_date is null then start_date 
    when lag_end_date = start_date then start_date 
    else lag_end_date 
    end as adj_start_date 
from (
    select start_date, end_date, 
    lag(end_date) over (order by start_date, end_date) as lag_end_date 
    from <your_table> 
) 

SQL Fiddle)。

case的第一個when子句處理'最早的'行,並且具有最早的開始日期;由於沒有前一行lag將是null

然後,您可以過濾結果以獲得start_dateadj_start_date不匹配的結果。 (Another SQL Fiddle)。

您可以使用同一種構建在merge做更新:

merge into <your table> 
using (
    select r_id, start_date, end_date, 
    case when lag_end_date is null then null 
     when lag_end_date = start_date then null 
     else lag_end_date 
    end as adj_start_date 
    from (
    select rowid as r_id, start_date, end_date, 
     lag(end_date) over (order by start_date, end_date) as lag_end_date 
    from t42 
) 
) t 
on (your_table>.rowid = t.r_id and t.adj_start_date is not null) 
when matched then 
update set <your table>.start_date = t.adj_start_date; 

SQL Fiddle)。

+0

謝謝亞歷克斯。它非常有幫助,爲我工作。乾杯.... – Harry

1

SELECT語句很簡單:

select * from your_table t1 
where t1.end_date is not null 
and not exists 
    (select null from your_table t2 
    where t2.start_date = t1.end_date 
    and t2.row_no != t1.row_no) 

子查詢阻止記錄3從滿足自身的資格。這可能不是完整的解決方案。如果您有多個記錄具有相同的開始日期和結束日期,那麼您最終可能無法識別某些記錄。在這種情況下,ROW_NO的可靠性很重要。

如果你能保證,對於任何一對給定的記錄高ROW_NO始終表示按時間順序記錄以後再修復很簡單:

 where t2.start_date = t1.end_date 
    and t2.row_no > t1.row_no) 

有一些情況,其中本次擔保也許是不可能的;它取決於如何分配ROW_NO。但是,這裏已經有了一些假設,除非你提供更多細節,否則我不打算解決它們。

UPDATE語句更棘手。

+0

感謝APC的迴應。我感謝你的時間。 – Harry