我有一张包含以下数据的表
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
关于从哪里开始的任何想法?我所做的很多阅读建议我需要创建条目,并且每一天都要创建一次条目并删除重叠日期并相应地管理日期。这是唯一的方法吗?
答案 0 :(得分:0)
我认为这种问题在某种程序方法中更好地解决,也是为了便于阅读。尽管如此,为了好玩,我想出了一个SQL语句,它借助rownum语句完成了这个技巧(在Oracle语法中,因为我手头没有sql-server数据库):
我们假设您的表名为DATE_TABLE
,其中包含START_DATE
列和END_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
中的最后一行。
我认为该陈述不能很好地扩展。