首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

连续天数及最大连续时间天数开始时间和结束时间有关问题

2013-04-26 
连续天数及最大连续时间天数开始时间和结束时间问题如上图,readinfo表中存着表的读数信息想求出每块表计的

连续天数及最大连续时间天数开始时间和结束时间问题
连续天数及最大连续时间天数开始时间和结束时间有关问题

如上图,readinfo表中存着表的读数信息
想求出每块表计的最大连续为0的天数和起始终止时间

上面得出的结果为:

meter_code                连续为0最大开始时间            连续为0最大结束时间              天数
meter_00001314          2013-04-20 00:00:00.000      2013-04-23 00:00:00.000        4




数据库环境为sql 2000
[解决办法]

if object_id('[TB]') is not null drop table [TB]
go
create table [TB] (meter_code nvarchar(28),read_date datetime,read_data int)
insert into [TB]
select 'meter_00001314','2013-04-20 00:00:00.000',0 union all
select 'meter_00001314','2013-04-21 00:00:00.000',0 union all
select 'meter_00001314','2013-04-22 00:00:00.000',0 union all
select 'meter_00001314','2013-04-23 00:00:00.000',0 union all
select 'meter_00001314','2013-04-24 00:00:00.000',0 union all
select 'meter_00001314','2013-04-25 00:00:00.000',13714 union all
select 'meter_00001314','2013-04-26 00:00:00.000',0 union all
select 'meter_00001314','2013-04-27 00:00:00.000',13773 union all
select 'meter_00001314','2013-04-28 00:00:00.000',14717 union all
select 'meter_00001314','2013-04-29 00:00:00.000',0 union all
select 'meter_00001315','2013-04-20 00:00:00.000',0 union all
select 'meter_00001315','2013-04-21 00:00:00.000',0 union all
select 'meter_00001315','2013-04-22 00:00:00.000',0 union all
select 'meter_00001315','2013-04-23 00:00:00.000',0 union all
select 'meter_00001315','2013-04-24 00:00:00.000',13664

select * from [TB]

SELECT  meter_code ,
        grp AS '连续为0最大开始时间' ,
        grp1 AS ' 连续为0最大结束时间' ,
        DATEDIFF(dd, grp, grp1) + 1 AS '天数'
FROM    ( SELECT    meter_code ,
                    ( SELECT    MIN(read_date)
                      FROM      TB AS B
                      WHERE     b.read_date >= a.read_date
                                AND B.meter_code = A.meter_code
                                AND A.read_data = 0
                                AND NOT EXISTS ( SELECT 1


                                                 FROM   TB AS c
                                                 WHERE  DATEDIFF(dd,
                                                              c.read_date,
                                                              b.read_date) = 1 )
                                AND b.meter_code = meter_code
                    ) AS grp ,
                    ( SELECT    MAX(read_date)
                      FROM      TB AS B
                      WHERE     b.read_date >= a.read_date
                                AND B.meter_code = A.meter_code
                                AND B.read_data = 0
                                AND EXISTS ( SELECT 1
                                             FROM   TB AS c
                                             WHERE  DATEDIFF(dd, c.read_date,
                                                             b.read_date) = 1 )


                                AND b.meter_code = meter_code
                    ) AS grp1
          FROM      TB AS A
        ) T
WHERE   grp IS NOT NULL
        AND grp1 IS NOT NULL
GROUP BY meter_code ,
        grp ,
        grp1


/*
meter_code连续为0最大开始时间 连续为0最大结束时间天数
meter_000013142013-04-20 00:00:00.0002013-04-29 00:00:00.00010
meter_000013152013-04-20 00:00:00.0002013-04-23 00:00:00.0004*/


[解决办法]
麻烦一点,但总归出结果了。
select * from [TB]

create table #t (id bigint identity (1,1),meter_code varchar(100),read_date datetime,rank_code int,rank_code1 int)
insert #t (meter_code,read_date)
select meter_code,read_date from tb where read_data=0  order by meter_code,read_date 
update x set rank_code=(case when exists
 (select id from #t t where t.meter_code=x.meter_code and t.read_date=dateadd(dd,-1,x.read_date) ) then 0 else 1 end  ) 
from #t x
 update #t set rank_code1=(select sum(rank_code) from #t t where t.id<=x.id) from #t x 
select rank_code1 as No,meter_code,min(read_date) as From_date,max(read_date) as To_date,datediff(dd,min(read_date),max(read_date))+1 as days from #t group by rank_code1,meter_code order by rank_code1,meter_code,min(read_date)
drop table #t

[解决办法]

 
SELECT  meter_code ,
        grp AS '连续为0最大开始时间' ,
        grp1 AS ' 连续为0最大结束时间' ,
        DATEDIFF(dd, grp, grp1) + 1 AS '天数'
FROM    ( SELECT    meter_code ,
                    ( SELECT    MIN(read_date)
                      FROM      TB AS B
                      WHERE     b.read_date >= a.read_date
                                AND B.meter_code = A.meter_code
                                AND A.read_data = 0


                                AND NOT EXISTS ( SELECT 1
                                                 FROM   TB AS c
                                                 WHERE  DATEDIFF(dd,
                                                              c.read_date,
                                                              b.read_date) = 1 )
                                AND b.meter_code = meter_code
                    ) AS grp ,
                    ( SELECT    MAX(read_date)
                      FROM      TB AS B
                      WHERE     b.read_date >= a.read_date
                                AND B.meter_code = A.meter_code
                                AND B.read_data = 0
                                AND EXISTS ( SELECT 1
                                             FROM   TB AS c
                                             WHERE  DATEDIFF(dd, c.read_date,
                                                             b.read_date) = 1 


                                                             AND b.read_data = c.read_data)   --这里填个条件即可
                                AND b.meter_code = meter_code
                    ) AS grp1
          FROM      TB AS A
        ) T
WHERE   grp IS NOT NULL
        AND grp1 IS NOT NULL
GROUP BY meter_code ,
        grp ,
        grp1
        
/*
meter_code连续为0最大开始时间 连续为0最大结束时间天数
meter_000013142013-04-20 00:00:00.0002013-04-24 00:00:00.0005
meter_000013152013-04-20 00:00:00.0002013-04-23 00:00:00.0004*/

热点排行