用于匹配前一行中不同列中的模式的SQL语句

时间:2012-05-24 22:43:34

标签: sql sql-server select

我有一个类似于以下示例的表,该表是从使用ODBC进行内存管理系统的IIS日志记录中提取的。

logtime用户名操作目标参数

<小时/> 2012-05-24 18:13:23.000 - 获取/beta.pptx title = home
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文件名的行没有相应的用户名,我想我可以在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命令

2 个答案:

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