日期:2014-05-18  浏览次数:20506 次

匹配进出
0006 Login 2007-07-04   14:14:06.687
0006 Login 2007-07-04   14:38:09.267
0006 Logout 2007-07-04   14:39:55.720
0006 Login 2007-07-04   14:41:26.080
0006 Login 2007-07-04   15:10:40.297
0006 Login   2007-07-04   15:10:44.937
0006 Login   2007-07-04   15:11:48.987
0006 Logout 2007-07-04   15:12:31.687
0006 Login 2007-07-04   15:13:12.343
------------------------------------------------
最终目的是生成一个进出表
logout   配对最近的一个login
id               login                                             logout
0006 2007-07-04   14:14:06.687         null
0006           2007-07-04   14:38:09.267         2007-07-04   14:39:55.720
0006 2007-07-04   14:41:26.080         null
0006 2007-07-04   15:10:40.297         null
0006 2007-07-04   15:10:44.937         null
0006 2007-07-04   15:11:48.987         2007-07-04   15:12:31.687
0006 2007-07-04   15:13:12.343         null

谢谢大家

------解决方案--------------------
declare @t table(id varchar(10),type varchar(10),date datetime)
insert into @t select '0006 ',rtrim( 'Login '), '2007-07-04 14:14:06.687 '
insert into @t select '0006 ',rtrim( 'Login '), '2007-07-04 14:38:09.267 '
insert into @t select '0006 ',rtrim( 'Logout '), '2007-07-04 14:39:55.720 '
insert into @t select '0006 ',rtrim( 'Login '), '2007-07-04 14:41:26.080 '
insert into @t select '0006 ',rtrim( 'Login '), '2007-07-04 15:10:40.297 '
insert into @t select '0006 ',rtrim( 'Login '), '2007-07-04 15:10:44.937 '
insert into @t select '0006 ',rtrim( 'Login '), '2007-07-04 15:11:48.987 '
insert into @t select '0006 ',rtrim( 'Logout '), '2007-07-04 15:12:31.687 '
insert into @t select '0006 ',rtrim( 'Login '), '2007-07-04 15:13:12.343 '


select
a.id,a.date as login,b.date as logout
from
@t a,@t b
where
a.id=b.id
and
a.type= 'Login '
and
b.type= 'Logout '
and
a.date <b.date
and
not exists(select * from @t where type= 'Login ' and date> a.date and date <b.date)
union
select
a.id,a.date,null
from
@t a,@t b
where
a.id=b.id
and
a.type= 'Login '
and
b.type= 'Logout '
and
a.date <b.date
and
exists(select * from @t where type= 'Login ' and date> a.date and date <b.date)

/*
id login logout
---------- ----------------------- -----------------------
0006 2007-07-04 14:14:06.687 NULL
0006 2007-07-04 14:38:09.267 NULL
0006 2007-07-04 14:38:09.267 2007-07-04 14:39:55.720
0006 2007-07-04 14:41:26.080 NULL
0006 2007-07-04 15:10:40.297 NULL
0006 2007-07-04 15:10:44.937 NULL
0006 2007-07-04 15:11:48.987 2007-07-04 15:12:31.687
*/

------解决方案---------------