我有以下数据:
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
我无法找到一个很好的方法来做到这一点。
答案 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
值最后。如果您将来有日期,则需要使用不同的表达式。