суммировать количество дней во многих интервалах - PullRequest
2 голосов
/ 16 января 2012

У меня есть следующая таблица:

CREATE table DataDiff (CLI tinyint, id tinyint, date datetime, countable bit)
insert into DataDiff values (234,1,convert(datetime,'17/12/1997',103),1)
insert into DataDiff values (234,2,convert(datetime,'09/07/1998',103),0)
insert into DataDiff values (234,3,convert(datetime,'11/08/1998',103),1)
insert into DataDiff values (234,4,convert(datetime,'29/12/1998',103),0)
insert into DataDiff values (234,5,convert(datetime,'01/02/1999',103),1)
insert into DataDiff values (234,6,convert(datetime,'03/02/1999',103),0)
insert into DataDiff values (234,7,convert(datetime,'03/02/1999',103),1)
insert into DataDiff values (234,8,convert(datetime,'29/03/1999',103),0)
insert into DataDiff values (234,9,convert(datetime,'29/03/1999',103),1)
insert into DataDiff values (234,10,convert(datetime,'31/03/1999',103),0)

Мне трудно переписать, без RBAR, UDF для подсчета дней с ID = 1 до ID = 2, затем с ID = 3 до ID = 4 и т. Д., Всегда начинаю подсчет, когда COUNTABLE = 1 и останавливается, когда COUNTABLE = 0, а затем возвращает сумму для данного CLI.

Длина в днях пяти изображенных интервалов:

ID=2 - ID=1  = 204
ID=4 - ID=3  = 140
ID=6 - ID=5  = 2
ID=8 - ID=7  = 54
ID=10 -ID=9  = 2

в общей сложности 402 "исчисляемых" дня из общего количества 469 дней между ID = 1 и ID = 10

1 Ответ

3 голосов
/ 17 января 2012

Try:

select t1.cli ,
       sum(t1.countable  * 
           datediff(day, t1.[DATE], coalesce(t2.[DATE],getdate())) ) daycount
from DataDiff t1
left join DataDiff t2 on t1.cli = t2.cli and t1.id+1 = t2.id
group by t1.cli

(Предполагается, что если последняя записанная дата для cli является счетной, то она должна быть посчитана до текущей даты.)

...