表结构和数据:
表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木有出现
表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木有出现
解决方案 »
- 有关于SQL SERVER混合认证登录的问题?
- SQLSERVER 2000 中我只备份数据,不备份日志,怎么SQL语句操作?
- 一个Update的简单问题,在线等,解决了就结分
- 请教一个sql语句
- 关于exec sp_cursoropen @p1 output,@sql,@scrollopt=1,@ccopt=1,@rowcount=@pagecount output的提问
- 问一个SQL语句
- 连接远程SQL2000数据库服务器的问题??????????
- Microsoft and MERANT DataDirect Enable Java Connectivity to SQL Server
- 问题是一个初级的,关于MS SQL SERVER对图像的存贮。
- 请问当SQL Server的验证方式为NT集成时,用ADO访问时Connection的ConnectionString应该如何设置?
- 三个表组合查询显示 求查询SQ语句L
- VC用ADO如何将CString转换为varchar供查询变量使用
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
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 1
2 123 2 4 1
3 123 3 4 0(3 row(s) affected)
(
[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)
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 b
ON a.ADID=b.ADID
CROSS 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 t
WHERE (SELECT SUM(IntervalTimes) FROM cte WHERE row_id<=t.row_id)-IntervalTimes<DATEDIFF(second, StartTime, EndTime)
/*
ADID PID IntervalTimes
123 1 4
123 2 4
123 3 4*/
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:48')
--表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)
DECLARE @cnt INT
SELECT DATEDIFF(second, StartTime, EndTime) FROM @TempaTab
--SELECT @cnt
;WITH cte AS
(
SELECT *,row_id=ROW_NUMBER()OVER( ORDER BY number,pid)
FROM
(
SELECT a.id,b.ADID,b.PID,IntervalTimes,a.StartTime,EndTime,cnt=COUNT(*) OVER()
FROM @TempaTab a JOIN @TempcTab b
ON a.ADID=b.ADID
) t
CROSS 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 t
WHERE (SELECT SUM(IntervalTimes) FROM cte WHERE row_id<=t.row_id)-IntervalTimes<DATEDIFF(second, StartTime, EndTime)
/*
ADID PID IntervalTimes
123 1 4
123 2 4
123 3 4
123 1 4
123 2 4*/
;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 1
2 123 2 4 1
3 123 3 4 1(3 row(s) affected)
*/