日志解析器 2.2 查询以计算唯一用户
Log parser 2.2 Query to count Unique user
我一直在尝试对我的自定义日志构建查询,我在其中根据特定条件对用户进行排序以对他们进行一些概述。
我的日志包含用户每次尝试下载文件时的条目,该条目包含日期、ip、自定义生成的令牌以及用户尝试了多少次。
token是由SESSION存储的,一个token只对5次下载有效,也就是说一个ip可以有多个用户(不同的token),每个用户都有不同的尝试次数。
我想实现的很简单,我想把用户按ip分组,然后统计他们的尝试次数,然后找出有多少用户。
金额不是按 IP 计算的,而是按令牌计算的,这意味着日志条目可能如下所示:
IP 令牌尝试
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 无法与 [=36= 一起使用]GROUP BY 和我的 SUM() / 可能 COUNT() 当 Ip 不在 分组依据
(下面的片段是我用 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 用户尝试
123.456.789.012 4 4(4 个用户各尝试一次)
120.987.654.321 2 5(2个用户,一个用户试了一次,另一个用户试了4次)
444.444.444.444 1 1(一个用户,一次尝试)
我希望我说得有道理,否则我会很乐意详细说明/解释任何需要的东西:)
我相信你需要两个阶段。第一阶段折叠每个用户的条目:
SELECT
Ip,
Token,
MAX(TO_INT(replace_chr(Attempt, 'a', ''))) AS Attempts
FROM
...
GROUP BY
Ip,
Token
第二阶段然后由Ip rolls up:
SELECT
Ip,
COUNT(*) AS Users,
SUM(Attempts) As TotalAttempts
FROM
...
GROUP BY
Ip
我一直在尝试对我的自定义日志构建查询,我在其中根据特定条件对用户进行排序以对他们进行一些概述。
我的日志包含用户每次尝试下载文件时的条目,该条目包含日期、ip、自定义生成的令牌以及用户尝试了多少次。
token是由SESSION存储的,一个token只对5次下载有效,也就是说一个ip可以有多个用户(不同的token),每个用户都有不同的尝试次数。
我想实现的很简单,我想把用户按ip分组,然后统计他们的尝试次数,然后找出有多少用户。
金额不是按 IP 计算的,而是按令牌计算的,这意味着日志条目可能如下所示:
IP 令牌尝试 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 无法与 [=36= 一起使用]GROUP BY 和我的 SUM() / 可能 COUNT() 当 Ip 不在 分组依据
(下面的片段是我用 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 用户尝试 123.456.789.012 4 4(4 个用户各尝试一次) 120.987.654.321 2 5(2个用户,一个用户试了一次,另一个用户试了4次) 444.444.444.444 1 1(一个用户,一次尝试)
我希望我说得有道理,否则我会很乐意详细说明/解释任何需要的东西:)
我相信你需要两个阶段。第一阶段折叠每个用户的条目:
SELECT
Ip,
Token,
MAX(TO_INT(replace_chr(Attempt, 'a', ''))) AS Attempts
FROM
...
GROUP BY
Ip,
Token
第二阶段然后由Ip rolls up:
SELECT
Ip,
COUNT(*) AS Users,
SUM(Attempts) As TotalAttempts
FROM
...
GROUP BY
Ip