【问题标题】:SQL get number of unique client by browserSQL通过浏览器获取唯一客户端的数量
【发布时间】:2025-12-22 04:15:16
【问题描述】:

我正在使用 AWS Athena 来解析我的 Application Load Balancer 日志。

我正在尝试获取浏览器列表以及每个浏览器的唯一用户数。

我已设法获得此列表,但用户数不正确。我不知道如何按 IP 对用户进行分组。

1   Google Chrome       9000000
2   Apple Safari        8000000
3   Unknown             5000000
4   Mozilla Firefox     2000000
5   Internet Explorer     10000
6   Outlook               10000
7   Opera                    88
8   Edge                      7

这里是查询

SELECT DISTINCT
    CASE
    WHEN user_agent LIKE '%edge%'THEN 'Edge'
    WHEN user_agent LIKE '%MSIE%' THEN
    'Internet Explorer'
    WHEN user_agent LIKE '%Firefox%' THEN
    'Mozilla Firefox'
    WHEN user_agent LIKE '%Chrome%' THEN
    'Google Chrome'
    WHEN user_agent LIKE '%Safari%' THEN
    'Apple Safari'
    WHEN user_agent LIKE '%Opera%' THEN
    'Opera'
    WHEN user_agent LIKE '%Outlook%' THEN
    'Outlook'
    ELSE 'Unknown'
    END AS browser , COUNT(client_ip) AS Number
FROM alb_logs
WHERE parse_datetime(time,'yyyy-MM-DD''T''HH:mm:ss.SSSSSS''Z')
    BETWEEN parse_datetime('2018-01-01-00:00:00','yyyy-MM-DD-HH:mm:ss')
        AND parse_datetime('2018-07-18-00:00:00','yyyy-MM-DD-HH:mm:ss')
GROUP BY  CASE
    WHEN user_agent LIKE '%edge%'THEN 'Edge'
    WHEN user_agent LIKE '%MSIE%' THEN
    'Internet Explorer'
    WHEN user_agent LIKE '%Firefox%' THEN
    'Mozilla Firefox'
    WHEN user_agent LIKE '%Chrome%' THEN
    'Google Chrome'
    WHEN user_agent LIKE '%Safari%' THEN
    'Apple Safari'
    WHEN user_agent LIKE '%Opera%' THEN
    'Opera'
    WHEN user_agent LIKE '%Outlook%' THEN
    'Outlook'
    ELSE 'Unknown'
    END
ORDER BY  Number DESC

我错过了某种group by client_ip,但结果会出错...

【问题讨论】:

  • 你试过COUNT(DISTINCT client_ip)而不是COUNT(client_ip)吗?
  • 不,我没有。如果IP相同但浏览器不同,它会工作吗?是否会将其视为两个独立的用户?
  • 您按浏览器分组,因此相同的 IP 但不同的浏览器将分别计数(每个浏览器计数 1)。顺便说一句,您应该从 SELECT DISTINCT 中删除 DISTINCT,您可以将 GROUP BY CASE ... END 替换为 GROUP BY 1
  • 这应该是一个答案:-)。最后一个问题:我可以取平均值吗?就像拥有所有唯一用户的数量
  • 我现在明白了。不幸的是,为此您需要重新聚合所有行,例如:WITH your_query as ... select *, Number / (select sum(Number) from your_query) from your_query

标签: apache logging amazon-athena presto ansi-sql


【解决方案1】:

你需要COUNT(DISTINCT client_ip)聚合,也不需要SELECT DISTINCT,像这样

SELECT CASE WHEN user_agent ... END AS browser, COUNT(DISTINCT client_ip) AS Number
FROM alb_logs
WHERE ...
GROUP BY 1
ORDER BY 2 DESC

【讨论】:

    最近更新 更多