SQL получает номер уникального клиента браузером

Я использую 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, но результат будет неверным...


person Kaymaz    schedule 17.07.2018    source источник
comment
Вы пробовали COUNT(DISTINCT client_ip) вместо COUNT(client_ip)?   -  person Piotr Findeisen    schedule 17.07.2018
comment
Нет, я этого не сделал. Будет ли это работать, если один и тот же IP, но другой браузер? Будет ли это считаться двумя отдельными пользователями?   -  person Kaymaz    schedule 17.07.2018
comment
Вы группируете по браузерам, поэтому один и тот же IP-адрес, но разные браузеры будут учитываться отдельно (1 для каждого браузера). Кстати, вы должны удалить DISTINCT из SELECT DISTINCT и заменить GROUP BY CASE ... END только на GROUP BY 1.   -  person Piotr Findeisen    schedule 17.07.2018
comment
Это должен быть ответ :-). Последний вопрос: могу ли я получить среднее значение? Например, иметь количество всех уникальных пользователей   -  person Kaymaz    schedule 17.07.2018
comment
Я сделаю это ответ тогда. Я не получил ваш последний вопрос, хотя.   -  person Piotr Findeisen    schedule 17.07.2018
comment
Я хочу иметь % пользователей в браузере. Поэтому мне нужно общее количество пользователей.   -  person Kaymaz    schedule 17.07.2018
comment
Я вижу сейчас. К сожалению, для этого вам нужно будет повторно агрегировать все строки, например: WITH your_query as ... select *, Number / (select sum(Number) from your_query) from your_query   -  person Piotr Findeisen    schedule 17.07.2018


Ответы (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
person Piotr Findeisen    schedule 17.07.2018