2016-06-21 66 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中的最后一行。

我认为这个陈述不太好。