2012-01-16 95 views
2

我有以下表:总和天在许多时间间隔的计数

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 

从总的ID之间469天= 1和ID = 10

+0

如果你有几天的奇数,该怎么办? – 2012-01-16 19:51:25

+0

@Justin Satyr你是说如果最后COUNTABLE = 1?在这种情况下,它计数到目前为止。 – 2012-01-16 20:07:25

+0

你真的没有定义'COUNTABLE'是什么。 – 2012-01-16 20:30:23

回答

3

尝试共402“可数”天:

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中的最后记录的日期是可数的,则它应该被计数到当前日期。)

+0

这可能有点偏离主题,对不起,但是为了确保我很好地理解你的想法,并且也许在将来类似的情况下也要让自己足够清楚:当你(“你”=“说英语作为他们的第一语言“)说”直到......(某个日期)“,这是否暗示”某日期“是否被纳入或排除在范围之外,还是不存在默认的这种暗示?我曾经认为*有*含义,并且包含日期,但如果我现在要根据您的查询进行判断,那么它实际上只是另一种方式。 – 2012-01-16 21:33:32

+0

@AndriyM:我认为“高达”意味着*包括*最后的日期,但这不一定是明确的 - 上下文可以提供澄清。在这种情况下,我假定当前日期是下一个*适用*日期。 – 2012-01-16 21:49:36

+0

噢,所以最后它*取决于我的背景,我明白了。 :)有道理,非常感谢你! – 2012-01-16 21:58:54