读书人

时长间距求次数算法

发布时间: 2012-11-05 09:35:12 作者: rapoo

时长,间隔,求次数算法,急急急!!!
表结构和数据:
表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) 


[解决办法]

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:38')--表2DECLARE @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)DECLARE @cnt INT SELECT @cnt =COUNT(*) FROM @TempcTab a JOIN @TempaTab b ON a.ADID=b.ADID--SELECT @cnt;WITH cte AS(SELECT a.id,b.ADID,b.PID,IntervalTimes,a.StartTime,EndTime,row_id=ROW_NUMBER()OVER( ORDER BY number,pid) FROM @TempaTab a JOIN @TempcTab bON a.ADID=b.ADIDCROSS APPLY (SELECT number FROM master..spt_values WHERE type='p' AND number <=DATEDIFF(second, StartTime, EndTime)/IntervalTimes/@cnt) app)SELECT ADID,PID,    IntervalTimes FROM cte  AS tWHERE  (SELECT SUM(IntervalTimes)  FROM cte WHERE row_id<=t.row_id)-IntervalTimes<DATEDIFF(second, StartTime, EndTime)/*ADID    PID    IntervalTimes123    1    4123    2    4123    3    4*/
[解决办法]
SQL code
;WITH cte AS(    SELECT *        ,ISNULL((SELECT SUM(IntervalTimes) FROM @TempcTab i WHERE o.ADID = i.ADID AND o.PID > i.PID),0) AS Tot1        ,SUM(IntervalTimes) OVER(PARTITION BY ADID) AS Tot2    FROM @TempcTab o)SELECT b.ID,b.ADID,b.PID,b.IntervalTimes,DATEDIFF(S,a.[StartTime],a.[EndTime])/b.Tot2+CASE WHEN DATEDIFF(S,a.[StartTime],a.[EndTime])%b.Tot2 > b.Tot1 THEN 1 ELSE 0 END AS 次数FROM @TempaTab a JOIN cte b ON a.ADID = b.ADID/*ID          ADID                 PID         IntervalTimes 次数----------- -------------------- ----------- ------------- -----------1           123                  1           4             12           123                  2           4             13           123                  3           4             1(3 row(s) affected)*/
[解决办法]
有少少理解了,好强大

读书人网 >SQL Server

热点推荐