SQL как найти среднего пользователя из каждой категории на типичную дату - PullRequest
0 голосов
/ 26 марта 2020

У меня есть таблица пользователей, как показано ниже;

Column Name       Column Datatype    Column Description
user_id           varchar            Unique user id
reg_ts            timestamp          Registration date
reg_device        varchar            Device registered   
reg_attribution   varchar            Acquisition type

Я пытаюсь выяснить, «В какой обычный день какая доля владельцев регистраций поступает из каждого источника приобретения?»

I написал приведенный ниже код, но не уверен, как разделить его на общее количество записей:

select reg_ts as registiration_date,
reg_attribution as acquisition_type, 
count(*)
from users
group by 1,2
order by 1 asc

После запуска приведенного выше кода я получаю только счет каждого типа сбора для каждой даты. Но мне нужно найти долю владельцев регистраций, приходящихся на каждый тип приобретения. Можете ли вы помочь мне исправить мой запрос?

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Вы можете использовать коррелированный подзапрос, который получает счет за день (при условии, что reg_ts - это день, несмотря на то, что он timestamp).

SELECT u1.reg_ts AS registiration_date,
       u1.reg_attribution AS acquisition_type,
       count(*) / (SELECT count(*)
                          FROM users u2
                          WHERE u2.reg_ts = u1.reg_ts) AS share
       FROM users u1
       GROUP BY u1.reg_ts,
                u1.reg_attribution
       ORDER BY u1.reg_ts ASC;

Редактировать:

Если вы хотите, чтобы соотношение относилось к общему количеству пользователей, а не пользователей, которые зарегистрировались в тот день, просто удалите предложение WHERE из подзапроса.

SELECT u1.reg_ts AS registiration_date,
       u1.reg_attribution AS acquisition_type,
       count(*) / (SELECT count(*)
                          FROM users u2) AS share
       FROM users u1
       GROUP BY u1.reg_ts,
                u1.reg_attribution
       ORDER BY u1.reg_ts ASC;
0 голосов
/ 26 марта 2020

Использовать оконные функции:

select reg_ts as registiration_date,
       reg_attribution as acquisition_type, 
        count(*) / sum(count(*))  over () as ratio
from users
group by 1, 2
order by 1 asc;

Они были доступны в MySQL версии 8.0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...