帮助查询

clo*_*dit 4 sql-server sql-server-2012 gaps-and-islands

我有以下数据。

我正在尝试获取项目处于特定状态的天数。下面的原始数据示例,我需要能够获得显示的结果。

我可以得到一些关于如何实现这一目标的指示吗?

原始数据

??????????????????????????????????????????????????????????
?                ID                ? STATUS ? ENTRY_DATE ?
??????????????????????????????????????????????????????????
? 541c4cfd009784b7ad7b47a552ab7ea2 ? WIH    ? 9/25/2015  ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CPL    ? 9/9/2015   ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CPL    ? 7/21/2015  ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CPL    ? 7/21/2015  ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CPL    ? 7/8/2015   ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CUR    ? 6/25/2015  ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CPL    ? 6/25/2015  ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CPL    ? 6/16/2015  ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? TNJ    ? 5/26/2015  ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CPL    ? 5/15/2015  ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CPL    ? 4/22/2015  ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CUR    ? 4/16/2015  ?
??????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

预期成绩

??????????????????????????????????????????????????????????????????????
?                ID                ? STATUS ? ENTRY_DATE ? EXIT_DATE ?
??????????????????????????????????????????????????????????????????????
? 541c4cfd009784b7ad7b47a552ab7ea2 ? WIH    ? 9/25/2015  ? NULL      ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CPL    ? 7/8/2015   ? 9/25/2015 ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CUR    ? 6/25/2015  ? 7/8/2015  ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CPL    ? 6/16/2015  ? 6/25/2015 ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? TNJ    ? 5/26/2015  ? 6/16/2015 ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CPL    ? 4/22/2015  ? 5/26/2015 ?
? 541c4cfd009784b7ad7b47a552ab7ea2 ? CUR    ? 4/16/2015  ? 4/22/2015 ?
??????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

Jam*_*s Z 6

您可以使用行号使用技巧对数据进行分组 - 按状态分区的行号。这将为一系列日期中具有相同状态的行创建相同的编号。这仅需要按 entry_date 和 status 排序的行,但您可能希望在同一天为条目做一些更好的事情:

select
  ID, status, 
  min(entry_date) as entry_date, 
  nullif (max(exit_date),'99991231') as exit_date
from
(
  select
    *,
    isnull(lead(entry_date) over (partition by id order by entry_date, status),'99991231') as exit_date,
    row_number() over (partition by id order by entry_date, status)
    - row_number() over (partition by id, status order by entry_date) as GRP
  From 
    table1
) X
group by ID, status, GRP
order by id, entry_date desc
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle 中的示例

更新:修复了按 id 分组的问题,为最新状态有多于一行的情况添加了对 null / max exit_date 的处理。