当前位置: 代码迷 >> Sql Server >> 时长,间距,求次数算法,
  详细解决方案

时长,间距,求次数算法,

热度:15   发布时间:2016-04-25 01:15:00.0
时长,间隔,求次数算法,急急急!!!
表结构和数据:
表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)/            (select sum(IntervalTimes) from @TempcTab                                           where ADID=a.ADID)+1 else             (select datediff(ss,StartTime,EndTime) from @TempaTab where ADID=a.ADID)/            (select sum(IntervalTimes) from @TempcTab                                           where ADID=a.ADID) end                                                                        from  @TempcTab a  /* ID          ADID                 PID         IntervalTimes ----------- -------------------- ----------- ------------- -----------1           123                  1           4             12           123                  2           4             13           123                  3           4             0(3 row(s) affected)
  相关解决方案