日期:2014-05-17  浏览次数:20566 次

时长,间隔,求次数算法,急急急!!!
表结构和数据:
表1
DECLARE @TempaTab TABLE
(
  [ID] INT IDENTITY(1, 1) PRIMARY KEY,
  [ADID] varchar(20), //编码
  [StartTime] varchar(19), //开始时间
  [EndTime] varchar(19) //结束时间
)
INSERT INTO @TempaTab(ADID,StartTime,EndTime)
VALUES ('123','2003-01-01 03:44:29','2003-01-01 03:44:38')
表2
DECLARE @TempcTab TABLE
(
  [ID] INT IDENTITY(1, 1) PRIMARY KEY,
  [ADID] varchar(20), //编码
  [PID] INT, //编号
  [IntervalTimes] INT //间隔时间(单位:秒)
)
INSERT INTO @TempcTab(ADID,PID,IntervalTimes)
VALUES('123',1,4)
INSERT INTO @TempcTab(ADID,PID,IntervalTimes)
VALUES('123',2,4)
INSERT INTO @TempcTab(ADID,PID,IntervalTimes)
VALUES('123',3,4)

问题:
根据表1的开始时间和结束时间能得到时间差为9秒
SELECT datediff(second, StartTime, EndTime) FROM @TempaTab
现在要求:对应表1中的编码‘123’,表2中的3条数据根据间隔时间各出现了几次,3条数据的间隔时间是一样滴

结果:因时长是9秒,那应该是对应的PID编号1,2,3各出现了一次,如果是8秒那对应的PID编号1,2出了一次,3木有出现




------解决方案--------------------
如果是13秒的话 ,1出现2次,2和3各一次 对吧?
------解决方案--------------------
哦,原来是这样,懂了
探讨

如果是13秒的话 ,1出现2次,2和3各一次 对吧?

------解决方案--------------------
用总时间(总秒数)除以总间隔时间(所有时间间隔之和)得到所有记录一起出现的次数得到最后一条记录出现的次数
总时间(总秒数)除以总间隔时间(所有时间间隔之和)的余数除以除去最后一个记录的时间间隔之和+最后一条记录出现的次数就是倒数第二条记录出现的次数
依次类推就可以得出所有的数据出现的次数
------解决方案--------------------
declare @ADID varchar(20)='123'
declare @IT int 
declare @I int =0
declare @J int =0
declare @G int =1
select @IT=DATEDIFF(s,starttime,endtime) from @TempaTab where ADID=@ADID
declare @TB table(ID int identity(1,1),PID int,IntervalTimes int,total int default 0)
insert into @TB(PID,IntervalTimes) select PID,IntervalTimes from @TempcTab where ADID=@ADID order by pid 
select @J=MAX(ID) from @TB
while @I<@IT
begin

select @I=@I+IntervalTimes from @TB where ID=@G
update @TB set total=total+1 where ID=@G
set @G=@G+1
if @G>@J 
set @G=1
end
select pid,total from @TB
------解决方案--------------------
写的很繁琐,自己优化
SQL code
DECLARE @TempaTab TABLE
(
   [ID] INT IDENTITY(1, 1) PRIMARY KEY,
   [ADID] varchar(20), --//编码
   [StartTime] varchar(19), --//开始时间
   [EndTime] varchar(19) --//结束时间
)
INSERT INTO @TempaTab(ADID,StartTime,EndTime)
VALUES ('123','2003-01-01 03:44:29','2003-01-01 03:44:37')

DECLARE @TempcTab TABLE
(
   [ID] INT IDENTITY(1, 1) PRIMARY KEY,
   [ADID] varchar(20), --//编码
   [PID] INT, --//编号
   [IntervalTimes] INT --//间隔时间(单位:秒)
)
INSERT INTO @TempcTab(ADID,PID,IntervalTimes)
VALUES('123',1,4)
INSERT INTO @TempcTab(ADID,PID,IntervalTimes)
VALUES('123',2,4)
INSERT INTO @TempcTab(ADID,PID,IntervalTimes)
VALUES('123',3,4)

select *,
case when (select datediff(ss,StartTime,EndTime) from @TempaTab where ADID=a.ADID)%
            (select sum(IntervalTimes) from @TempcTab 
                                          where ADID=a.ADID)
             > isnull((select sum(IntervalTimes) from @TempcTab 
                                          where ADID=a.ADID and PID<a.PID),0) 
             and 
             (select datediff(ss,StartTime,EndTime) from @TempaTab where ADID=a.ADID)%
            (select sum(IntervalTimes) from @TempcTab 
                                          where ADID=a.ADID)
             <=(select sum(IntervalTimes) from @TempcTab 
                                          where ADID=a.ADID) then  
            (select datediff(ss,StartTime,EndTime) from @TempaTab where ADID=a.ADID)/
            (