2016-06-21 107 views
-2

安排日期,我有以下數據刪除重疊的天,SQL

Start  End   
=====  ===   
12/21/2011 12/20/2012 
05/05/2012 10/20/2013 
12/21/2012 12/20/2013 
12/21/2013 12/20/2014 
12/21/2014 12/20/2015 

表,並希望得到以下結果

Start  End   
=====  ===   
12/21/2011 05/04/2012 
05/05/2012 10/20/2013 
10/21/2013 12/20/2013 
12/21/2013 12/20/2014 
12/21/2014 12/20/2015 

就從哪裏開始任何想法?我所做的很多閱讀建議我需要創建條目並在每個單獨的一天中刪除重疊的日期並相應地管理日期。這是唯一的方法嗎?

+1

你在什麼版本的SQL服務器上? –

+0

對不起,問題不清楚。你發佈了兩張表格,你想讓我們尋找差異嗎? – derloopkat

+0

看看使用LAG()函數。 –

回答

0

我認爲這種問題在某種程序方法中可以更好地解決,也是爲了可讀性。儘管如此,爲了好玩,我想出了一個SQL語句,它在rownum語句的幫助下完成(在Oracle語法中,因爲我手頭沒有sql-server數據庫):

讓我們假設你的表被稱爲DATE_TABLESTART_DATEEND_DATE。那麼語句如下:

select start_date, 
     coalesce(
      (select case when tbl_inner.start_date < tbl_outer.end_date 
         then tbl_inner.start_date - 1 
         else tbl_outer.end_date end 
      from (select rownum row_num, start_date, end_date from date_table order by 1) tbl_inner 
      where tbl_inner.row_num = tbl_outer.row_num + 1), 
      tbl_outer.end_date) 
from (select rownum row_num, start_date, end_date from date_table order by 1) tbl_outer; 

內選擇提供了表DATE_TABLE的行與可由外部選擇所引用的行號。如果沒有COALESCE子句,則該語句不適用於DATE_TABLE中的最後一行。

我認爲這個陳述不太好。