关于查询的问题,非常有挑战性,请邹大斑竹和其他大侠进来看看

atao98 2004-09-27 07:11:05
有一张表t_log是用来记录用户日志的,表的结构和数据大体是这样:
   ID   user_name   visit_file   visit_time
1 admin c:\test.txt 2004-12-27 22:34:43
2 admin c:\test.txt 2004-12-27 22:38:37
3 admin c:\test.txt 2004-12-27 22:38:43
4 admin c:\test2.txt 2004-12-27 22:39:40
5 admin c:\test2.txt 2004-12-27 22:40:43
6 admin c:\test2.txt 2004-12-27 22:41:33
7 sys c:\test2.txt 2004-12-27 22:38:43
8 sys c:\test2.txt 2004-12-27 22:39:55
9 admin c:\test.txt 2004-12-27 22:43:30
10 admin c:\test.txt 2004-12-27 22:44:30
11 admin c:\test.txt 2004-12-27 22:45:30
12 admin c:\test.txt 2004-12-27 22:46:30
问题,我需要把这个表转换成这样的形式:
       user_name visit_file visit_time
admin c:\test.txt 2004-12-27 22:34:43--2004-12-27 22:38:43
admin c:\test2.txt 2004-12-27 22:39:40--2004-12-27 22:41:33
sys c:\test2.txt 2004-12-27 22:38:43--2004-12-27 22:39:55
admin c:\test.txt 2004-12-27 22:43:30--2004-12-27 22:46:30
即要从表中找出用户从什么时候到什么时候访问了那个文件,不知我说清楚了没,请高手多多指教,我想了好久都想不出来。

不懂的兄弟帮忙顶一顶,谢谢。
...全文
199 点赞 收藏 13
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lzz333 2004-09-30
up
回复
selectplayer 2004-09-30
select user_name,visit_file,visittime=convert(char(20),x.visit_time,121)+'--'+convert(char(20),x.visit_time,121)
from t_log x,t_log y
where x.user_name=y.user_name and x.visit_file=y.visit_file
and x.id=(select isnull(max(id)+1,1) from t_log where id<x.id and (x.user_name<>y.user_name or x.visit_file<>y.visit_file ))
and y.id=(select isnull(min(id)-1,(select max(id) from t_log)) from t_log where id>x.id and (user_name<>x.user_name or visit_file<>x.visit_file ))
回复
atao98 2004-09-29
看来没有更好的办法了,结帖
回复
atao98 2004-09-28
这个不错,我试试
回复
pbsql 2004-09-27
看这样是否满足要求:
--drop table #t
create table #t(ID int,user_name varchar(10),visit_file varchar(100),visit_time datetime)
insert #t(ID,user_name,visit_file,visit_time)
select 1, 'admin','c:\test.txt', '2004-12-27 22:34:43' union all
select 2, 'admin','c:\test.txt', '2004-12-27 22:38:37' union all
select 3, 'admin','c:\test.txt', '2004-12-27 22:38:43' union all
select 4, 'admin','c:\test2.txt', '2004-12-27 22:39:40' union all
select 5, 'admin','c:\test2.txt', '2004-12-27 22:40:43' union all
select 6, 'admin','c:\test2.txt', '2004-12-27 22:41:33' union all
select 7, 'sys', 'c:\test2.txt', '2004-12-27 22:38:43' union all
select 8, 'sys', 'c:\test2.txt', '2004-12-27 22:39:55' union all
select 9, 'admin','c:\test.txt', '2004-12-27 22:43:30' union all
select 10, 'admin','c:\test.txt', '2004-12-27 22:44:30' union all
select 11, 'admin','c:\test.txt', '2004-12-27 22:45:30' union all
select 12, 'admin','c:\test.txt', '2004-12-27 22:46:30'

alter table #t add sort int--加一列来分组排序
go
declare @user_name varchar(10),@visit_file varchar(100),@i int
set @i=0
update #t set @i=case when user_name=@user_name and visit_file=@visit_file
then @i
else @i+1
end,
@user_name=user_name,@visit_file=visit_file,sort=@i
select user_name,visit_file,
convert(varchar(20),min(visit_time),120)+'--'+convert(varchar(20),max(visit_time),120)
from #t group by user_name,visit_file,sort order by sort
drop table #t
回复
atao98 2004-09-27
我曾问过一个类似的问题,邹大斑竹帮我解决了,但是我没法将它移植过来:http://community.csdn.net/Expert/topic/3330/3330297.xml?temp=.2833063
不知邹斑竹在不在?是不是领奖去了(MVP):)
回复
atao98 2004-09-27
我知道挺难的,不知用存储过程能不能实现?
回复
atao98 2004-09-27
to: pbsql(风云)兄,你的方法不对,因为我只要把连续访问的记录合在一起,要把不连续访问的另外分类,这样才符合实际,因为如果admin用户在2004-9-24日访问了test.txt文件一次,在2004-9-26又访问了一次,按照你的方法将得出这个用户在2004-9-24--2004-9-26日期间一直在访问这个文件,这跟实际情况不符
回复
yjdn 2004-09-27
有难度,
回复
atao98 2004-09-27
对,因为这样才符合实际嘛
回复
yjdn 2004-09-27
楼主还要要求同一文件,在不连续访问的时候,还要分类显示出来?
回复
yjdn 2004-09-27
select [user_name],visit_file,
cast(min(visit_time) as varchar(20))
+'---'+cast(max(visit_time) as varchar(20))as visit_time
from tn group by visit_file,user_name
回复
pbsql 2004-09-27
select user_name,visit_file,
convert(varchar(20),min(visit_time),120)+'--'+convert(varchar(20),max(visit_time),120)
from t_log group by user_name,visit_file
回复
相关推荐
发帖
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2004-09-27 07:11
社区公告
暂无公告