我有一个类似于以下示例的表,该表是从使用ODBC进行内存管理系统的IIS日志记录中提取的。
logtime用户名操作目标参数
<小时/> 2012-05-24 18:13:23.000 - 获取/beta.pptx title = home
我想知道的是谁正在下载哪些文件(如PPTX和DOCX文件)。由于目标包含PPTX或DOCX文件名的行没有相应的用户名,我想我可以在logtime中从logtime向后追踪,以查找具有除“ - ”之外的用户名条目的下一行加入列出了PPTX或DOCX文件的行。在我的测试中,这似乎是准确的。那么我怎样才能创建一个允许我完成此选择的选择语句?
我想我得到了以下内容,它显示了日期戳,每个用户每天只有一个确切文件名的实例:
SELECT DISTINCT
v.username
, v.logdate
, SUBSTRING(v.target, CASE WHEN CHARINDEX('=', v.target) > 0 THEN CHARINDEX('=', v.target)+1 ELSE LEN(v.target) END, LEN(v.target)) as 'fileName'
这 ( 选择 (选择Top 1 temp2.username 从InternetLog作为temp2 其中temp2.logtime&lt; = temp.logtime 和temp2.username!=' - ' 按temp2.logtime desc命令)作为用户名, LEFT(CONVERT(DATETIME,temp.logtime,101),11)AS logdate, temp.target 来自InternetLog作为临时 where(RIGHT(RTRIM(temp.target),4)='docx'或RIGHT(RTRIM(temp.target),4)='pptx') )AS诉 哪里 v.username LIKE'%johnd%'由logdate desc命令
答案 0 :(得分:0)
declare @temp table (logtime smalldatetime, username varchar(10), target varchar(10))
insert into @temp(logtime, username, target)
values('2012-05-24 14:13:23.000', 'name', 'df'),
('2012-05-24 16:13:23.000', '-', 'sdf'),
('2012-05-24 18:13:23.000', '-', 'DOCX'),
('2012-05-24 19:13:23.000', 'sdfsdf', 'sdf'),
('2012-05-24 19:15:23.000', '-', 'PPTX')
select
(select Top 1 temp2.username
from @temp as temp2
where temp2.logtime<temp.logtime
and temp2.username != '-'
order by temp2.logtime desc) as username,
temp.logtime,
temp.target
from @temp as temp
where temp.target like '%DOCX%' or temp.target like '%PPTX%'
order by temp.logtime
给出结果:
(5 row(s) affected)
username logtime target
---------- ----------------------- ----------
name 2012-05-24 18:13:00 DOCX
sdfsdf 2012-05-24 19:15:00 PPTX
(2 row(s) affected)
编辑如果您想通过外部查询过滤日期范围(如果您获得的ID不符合您的时间和用户名,则无关紧要然而原始目标/时间匹配)然后将其添加到外部的位置。对于用户名,您必须更改它。我还没有测试它,但可能是这样的:
select
(select Top 1 temp2.username
from @temp as temp2
where temp2.logtime<temp.logtime
and temp2.username != '-'
order by temp2.logtime desc) as username,
temp.logtime,
temp.target
from @temp as temp
join (select Top 1 temp2.username
from @temp as temp2
where temp2.logtime<temp.logtime
and temp2.username != '-'
order by temp2.logtime desc) as users
on 1=1
where (temp.target like '%DOCX%' or temp.target like '%PPTX%')
and users.username like '%domain\user%'
and temp.logtime < @maxtime
and temp.logtime > @minTime
order by temp.logtime
其中最长和最短时间是您要过滤的日期时间。
答案 1 :(得分:0)
DECLARE @documents TABLE (DocumentName varchar(50))
DECLARE @downloads TABLE (target varchar(50))
INSERT @documents SELECT 'test.pptx'
INSERT @documents SELECT 'test2.pptx'
INSERT @downloads SELECT '/test.pptx'
SELECT *
FROM @documents doc
INNER JOIN @downloads dwn ON dwn.target LIKE '%' + doc.DocumentName + '%'