日志解析器2.2查询计数唯一用户

时间:2015-01-28 08:40:03

标签: sql logparser

我一直在尝试在我的自定义日志上构建查询,我根据某些条件对用户进行排序,以便对其进行一些概述。

我的日志包含每次用户尝试下载文件时的条目,该条目包含日期,IP,自定义生成的令牌以及该用户尝试过的次数。

令牌由SESSION存储,令牌仅对5次下载尝试有效,这意味着一个ip可以拥有多个用户(具有不同的令牌),每个用户都有不同的尝试次数。

我想要实现的是相当简单,我想通过ip对用户进行分组,然后计算他们的尝试次数,然后找出有多少用户。

金额不计入每个IP,而是每个标记,这意味着日志条目可能如下所示:

IP                 TOKEN      ATTEMPT
111.111.111.111    DK1234     a1
111.111.111.111    DK9876     a1
111.111.111.111    DK9876     a2
222.222.222.222    DK5432     a1

以下是我尝试实现此目标的最新尝试,但是当我尝试使其背后的逻辑工作时,它并不是我想要的。

(涉及的字段是:Ip,Token和Attempt(尝试值看起来像这样:a1,a2,a3等等,用户进行的每次尝试)。)

SELECT 
    Ip,
    CASE TO_INT(replace_chr(Attempt, 'a', '')) 
        WHEN 1 
        THEN 
            'MUL' 
        ELSE 
            'ONE' 
    END 
    AS Users,
    SUM(TO_INT(replace_chr(Attempt, 'a', ''))) AS Attempts
FROM 
    --LOG PATH
WHERE 
        Status = 'SUCCESS' 
    and 
        TO_DATE(TO_TIMESTAMP(LDate, 'dd/MM/yyyy-hh:mm:ss')) > SUB( TO_LOCALTIME(SYSTEM_TIMESTAMP()), TIMESTAMP('8','d') )
GROUP BY
    Ip,
    Users

如果我可以以某种方式存储每个IP的每个唯一令牌的值,并将其与结果一起存储,但我不能/不知道如何实现这一点。

使用 DISTINCT 无法正常工作,因为当我这样做时,我收到一条错误消息,指出 DISTINCT 无法与 GROUP BY 一起使用我的 SUM() /可能的 COUNT()在Ip不在 GROUP BY

(下面的代码段是我用DISTINCT / count尝试过的)

SELECT 
    Ip,
    COUNT(DISTINCT Token),
    SUM(TO_INT(replace_chr(Attempt, 'a', ''))) AS Attempts
FROM 
    --Log Path
WHERE 
        Status = 'SUCCESS' 
    and 
        TO_DATE(TO_TIMESTAMP(LDate, 'dd/MM/yyyy-hh:mm:ss')) > SUB( TO_LOCALTIME(SYSTEM_TIMESTAMP()), TIMESTAMP('8','d') )
GROUP BY
    Ip

我希望我的结果网格结束:(当然没有解释文字)

IP                 Users     Attempts
123.456.789.012     4           4 (4 users each trying one time)
120.987.654.321     2           5 (2 users, One user tried once and the other user tried 4 times)
444.444.444.444     1           1 (One user, one attempt)

我希望我有意义,否则我会很乐意详细说明/解释所需的一切:)

1 个答案:

答案 0 :(得分:1)

我相信你需要两个阶段。第一阶段折叠每个用户的条目:

SELECT 
    Ip,
    Token,
    MAX(TO_INT(replace_chr(Attempt, 'a', ''))) AS Attempts
FROM 
    ...
GROUP BY
    Ip,
    Token

然后第二阶段由Ip卷起:

SELECT 
    Ip,
    COUNT(*) AS Users,
    SUM(Attempts) As TotalAttempts
FROM 
    ...
GROUP BY
    Ip