我一直在尝试在我的自定义日志上构建查询,我根据某些条件对用户进行排序,以便对其进行一些概述。
我的日志包含每次用户尝试下载文件时的条目,该条目包含日期,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)
我希望我有意义,否则我会很乐意详细说明/解释所需的一切:)
答案 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