我有一个data.frame,如下所示。
toolid startdate enddate stage
abc 1-Jan-13 5-Jan-13 production
abc 6-Jan-13 10-Jan-13 down
xyz 3-Jan-13 8-Jan-13 production
xyz 9-Jan-13 15-Jan-13 down
我想获得最终输出,如下所示。输出需要返回 - 每个阶段的计数(可能超过2个阶段)在1jan13到15jan13(或用户想要的任何日期范围)之间的每一天。我能够在R中创建所需的结果。我还在SQL中编写了一个游标,它实现了目的。但有没有办法在不使用游标的情况下做同样的事情?我正在寻找逻辑和方向。
date down production
1 2013-01-01 0 1
2 2013-01-02 0 1
3 2013-01-03 0 2
4 2013-01-04 0 2
5 2013-01-05 0 2
6 2013-01-06 1 1
7 2013-01-07 1 1
8 2013-01-08 1 1
9 2013-01-09 2 0
10 2013-01-10 2 0
11 2013-01-11 1 0
12 2013-01-12 1 0
13 2013-01-13 1 0
14 2013-01-14 1 0
15 2013-01-15 1 0
答案 0 :(得分:3)
我认为这可能是你想要的。它需要一个递归CTE来获取该范围内每一天的行。
with daterange as (
select startdate=min(startdate),enddate=max(enddate) from #source
), dates as (
select d=(select startdate from daterange) union all
select dateadd(day,1,d) from dates where d<(select enddate from daterange)
)
select
d,
down=(select count(*) from #source where d between startdate and enddate and stage='down'),
production=(select count(*) from #source where d between startdate and enddate and stage='production')
from dates
order by d;