2013-09-19 2 views
1

У меня есть data.frame, как показано ниже.SQL-код, чтобы получить счет за каждый день диапазона

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 

Я хочу получить окончательный результат, который будет как показано ниже. Вывод должен возвращать - подсчет каждого этапа (может быть более двух этапов) в течение каждого дня между 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

Какая СУБД вы используете? Postgres? Oracle? –

+0

sql server management studio – user2543622

+0

Это не СУБД, это инструмент клиента SQL. –

ответ

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; 
+0

Отредактировано для удаления 'MAX()' из рекурсивной части CTE, где это недопустимо. –

Смежные вопросы