用于合并日期的SQL

时间:2015-11-18 18:16:50

标签: sql sql-server-2008

我有以下数据:

rasID   changeDate  changeDateEnd   status
11860   2015-09-08  2015-10-09      Active
11860   2015-10-09  2015-10-19      Planning
11860   2015-10-19  2015-10-19      Planning
11860   2015-10-19  2015-11-18      Planning
11860   NULL        2015-11-18      Planning
11861   2015-09-08  2015-10-09      Planning
11861   2015-10-09  2015-10-12      Requested
11861   2015-10-12  2015-11-18      Planning
11861   NULL        2015-11-18      Planning  

我想要的是整合这些数据,看起来像这样:

rasID   changeDate  changeDateEnd   status
11860   2015-09-08  2015-10-09      Active
11860   2015-10-09  2015-11-18      Planning
11861   2015-09-08  2015-10-09      Planning
11861   2015-10-09  2015-10-12      Requested
11861   2015-10-12  2015-11-18      Planning

我无法找到一个很好的方法来做到这一点。

1 个答案:

答案 0 :(得分:0)

一种方法就是忽略changeDateEnd并专注于changeDate。然后,您想要组合相邻的行。

这样做的一种方法是使用行号与聚合的区别,这在SQL Server 2008中非常合适:

select rasId, min(changeDate), max(changeDate), status
from (select t.*,
             (row_number() over (partition by rasId order by coalesce(changeDate, getdate()) ) -
              row_number() over (partition by rasId, status order by coalesce(changeDate, getdate()) )
             ) as grp
      from table t
     ) t
group by rasId, grp,
order by rasId, min(changeDate);

coalesce()的目的只是为了确保NULL值最后。如果您将来有日期,则需要使用不同的表达式。