首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

怎么寻找相邻的数据

2012-01-30 
如何寻找相邻的数据原始数据templiu2frameidgroupidbvcitime113322:32223415:10313322:35433518:09523416:

如何寻找相邻的数据
原始数据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 行)

热点排行