0

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

logtime 用户名操作目标参数


2012-05-24 18:13:23.000 - 获取 /beta.pptx 标题 = 主页
2012-05-24 18:13:14.000 - 获取 /index.php -
2012-05-24 18:13:09.000 域\乔 GET /css.php -

我想找出谁在下载什么文件(如 PPTX 和 DOCX 文件)。由于 target 包含 PPTX 或 DOCX 文件名的行没有相应的用户名,我想我可以从 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'

FROM ( select (select (select Top 1 temp2.​​username from InternetLog as temp2 where temp2.​​logtime <= temp.logtime and temp2.​​username != '-' order by temp2.​​logtime desc) 作为用户名,LEFT(CONVERT(DATETIME, temp. logtime, 101), 11) AS logdate, temp.target from InternetLog as temp where (RIGHT(RTRIM(temp.target),4) = 'docx' or RIGHT(RTRIM(temp.target),4) = 'pptx' ) ) AS v WHERE v.username LIKE '%johnd%' order by logdate desc

4

2 回答 2

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 + '%'
于 2012-05-24T22:57:41.333 回答
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 

其中 max 和 min time 是您要过滤的日期时间。

于 2012-05-24T22:53:50.033 回答