2012-05-24 53 views
0

匹配不同的列模式我有类似于从使用ODBC日志记录与IIS的内容管理系统中提取下面的示例中的表。SQL语句从早期行

  logTime Description该条                                                                     用户名                           操作     目标           参数


2012-05-24 18:13:23.000                   -                                                 GET                   /beta.pptx      标题=家庭
2012-05-24 18:13:14.000                   -                                                 GET                    的index.php       -
2012-05-24 18点13分09秒。000      域\ joeh                         GET                   /css.php                 -

我试图找出谁在下载什么文件(如PPTX和DOCX文件)。由于目标包含PPTX或DOCX文件名称的行没有相应的用户名,因此我计算出我可以从日志时间向后追踪表中以查找具有除“ - ”以外的用户名条目的下一行,以便加入列有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' 

FROM ( 选择 (SELECT TOP 1 TEMP2。从InternetLog用户名 作为TEMP2 其中temp2.​​logtime < = temp.logtime 和temp2.​​username =! ' - ' 为了通过temp2.​​logtime降序)作为用户名, LEFT(CONVERT(DATETIME,temp.logtime,101) ,11)AS logdate, temp.target 从InternetLog作为临时 其中(RIGHT(RTRIM(temp.target),4)= '的docx' 或RIGHT(RTRIM(temp.target),4)= 'PPTX') )AS诉 WHERE v.username LIKE '%JOHND%' 的LOGDATE倒序

+0

我不知道我认为你的标题只是足够长的时间才能开始考虑描述你想要解决的问题的类型。 –

+0

我接受任何有关您认为更好的标题的建议。我认为这不是一件容易总结的事情,它应该有希望吸引SQL专家。 – techguy817

+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) 

编辑如果您想通过外部查询来筛选日期范围(和它如果您获得a的用户名​​,则无关紧要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 

,其中最大和最小的时间是要筛选由日期时间。

+0

谢谢凯拉。我在我的情况中使用了这个例子,它似乎正确返回;但是,我还需要将其扩展到以下内容: 1.能够通过结果集中的特定用户名进行过滤。我尝试了“AND like'%domain \ user%',但是它也返回了其他用户,所以我可能需要为此选择某种外部选择? – techguy817

+0

2.在日志时间范围内过滤日期范围 – techguy817

+0

稍后我可以查看它。 :)希望这是一个很好的起点 – Kyra

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 + '%'