如何寻找相邻的数据
原始数据templiu2
frameid groupid bvci time
1 1 33 22:32
2 2 34 15:10
3 1 33 22:35
4 3 35 18:09
5 2 34 16:05
6 1 33 23:00
7 3 35 19:00
8 2 34 17:00
想要得到的结果表#temp1
frameid groupid bvci time 与上条groupid bvci相同的数据的时间差
1 1 33 22:32 0
2 2 34 15:10 0
3 1 33 22:35 22:35-22:32= 3
4 3 35 18:09 0
5 2 34 16:05 16:05-15:10=55
6 1 33 23:00 23:00-22:35=25
7 3 35 19:00 19:00-18:09=51
8 2 34 17:00 17:00-16:05=55
我是用游标实现的,请问如何用SQL语句来实现呢?
自己试着写了一条,结果不对,会得到本条数据与本条数据前所有groupid,bvci相同的数据的时间差
select a.*,(a.time_stamp-b.time_stamp) as ctime into #temp1 from templiu2 a, templiu2 b where a.id!=b.id and a.frame_id!=b.frame_id and a.tlli=b.tlli and a.groupid=b.groupid and a.bvci=b.bvci and a.time_stamp> b.time_stamp
[解决办法]
select a,*,isnull(datediff(mi, '2000-1-1 '+b.time,, '2000-1-1 '+a.time),0) as [与上条groupid bvci相同的数据的时间差]
from templiu2 a left join templiu2 b
on a.groupid=b.groupid and a.bvci=b.bvci
and b.frameid=(select top 1 frameid from templiu2 where groupid=a.groupid and bvci=a.bvci and frameid <a.frameid order by frameid desc)
[解决办法]
--测试
declare @templiu2 table(
frameid int,
groupid int,
bvci int,
time varchar(10)
)
insert @templiu2 select
1, 1, 33, '22:32 '
union all select
2, 2, 34, '15:10 '
union all select
3, 1, 33, '22:35 '
union all select
4, 3, 35, '18:09 '
union all select
5, 2, 34, '16:05 '
union all select
6, 1, 33, '23:00 '
union all select
7, 3, 35, '19:00 '
union all select
8, 2, 34, '17:00 '
select a.*,isnull(datediff(mi, '2000-1-1 '+b.time, '2000-1-1 '+a.time),0) as [与上条groupid bvci相同的数据的时间差]
from @templiu2 a left join @templiu2 b
on a.groupid=b.groupid and a.bvci=b.bvci
and b.frameid=(select top 1 frameid from @templiu2 where groupid=a.groupid and bvci=a.bvci and frameid <a.frameid order by frameid desc)
--结果
frameid groupid bvci time 与上条groupid bvci相同的数据的时间差
----------- ----------- ----------- ---------- ------------------------
1 1 33 22:32 0
2 2 34 15:10 0
3 1 33 22:35 3
4 3 35 18:09 0
5 2 34 16:05 55
6 1 33 23:00 25
7 3 35 19:00 51
8 2 34 17:00 55
(所影响的行数为 8 行)