1

我有一个如下所示的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

我想获得最终输出,如下所示。输出需要返回 - 在 1 月 13 日到 15 月 13 日(或用户想要的任何日期范围)之间的每一天(可能有超过 2 个阶段)的每个阶段的计数。我能够在 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
4

1 回答 1

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;
于 2013-09-19T21:21:44.973 回答