时长,间隔,求次数算法,急急急!!!
表结构和数据:
表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各一次 对吧?
[解决办法]
哦,原来是这样,懂了
[解决办法]
用总时间(总秒数)除以总间隔时间(所有时间间隔之和)得到所有记录一起出现的次数得到最后一条记录出现的次数
总时间(总秒数)除以总间隔时间(所有时间间隔之和)的余数除以除去最后一个记录的时间间隔之和+最后一条记录出现的次数就是倒数第二条记录出现的次数
依次类推就可以得出所有的数据出现的次数
[解决办法]
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)*/
[解决办法]
有少少理解了,好强大