您可以使用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_date
和adj_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)。
那麼問題是什麼? –
所以基本上我認爲他希望查詢檢查前一個記錄的END DATE是否等於下一個記錄START DATE。如果不是,則返回該記錄(請求#1)。然後將START DATE更新爲與之前的END DATE(請求#2)相同。 –
@Radu Gheorghiu現貨。這就是我正在尋找的。 – Harry