Как написать запрос SQL для расчета среднего ежедневного показа объявлений на пользователя? - PullRequest
0 голосов
/ 13 марта 2020

Это пример таблицы для справки:

Предположим, мы изучаем среднее количество ежедневных показов рекламы на пользователя. Например, если у 100 пользователей было 10 показов рекламы каждые два дня go, а у 50 разных пользователей было 40 показов объявлений вчера, то среднесуточные показы объявлений на пользователя составляли бы 20 за эти два дня:

                       2 days ago Yesterday
Users                      100          50
Ad Impressions per User     10          40
Ad Impressions per Day     1000        2000

Среднесуточные показы объявлений на пользователя ((100 * 10 + 50 * 40) / 150) = 20

Вот вопрос: Теперь предположим, что у вас есть таблица показов, где каждая строка представляет Детали впечатления. Столбцы следующие:

строка страны (страна, из которой пользователь)

дата (дата, когда произошло впечатление)

user_id int (идентификатор пользователь)

показов int (количество показов)

1) Среднесуточные показы объявлений на пользователя только для пользователей из США

Мой ответ: НЕ РАБОТАЕТ- Я не думаю, что формула верна в моих расчетах

SELECT (b.all_users) from(
SELECT (imp_date),(SUM(impressions)*COUNT(user_id))all_users FROM jobs
WHERE country='US'
GROUP BY imp_date
) AS b;

2) Средние недельные показы на пользователя только для пользователей в Великобритании 3) Среднемесячное среднее количество показов на пользователя

1 Ответ

0 голосов
/ 13 марта 2020

Отсутствует какая-либо информация, чтобы ответить правильно, но я все еще попытаюсь ответить ...

Для вашего ежедневного запроса вам необходимо:

  • сгруппировать ваш результат по день GROUP BY imp_date
  • С этой группой вы можете сделать сумму, чтобы иметь общее количество отпечатков SUM(imp_count)
  • число пользователей, которые сделали печать в течение этого дня COUNT(DISTINCT(user_id))

Теперь вы можете ограничить среднесуточную печать SUM(imp_count) / COUNT(DISTINCT(user_id)) для пользователей из США WHERE country = 'US'

Осталось только настроить другие запросы в соответствии с желаемым периодом.


Вы можете показать небольшую демонстрацию на dbfiddle

-- DAILY
SELECT imp_date
    ,SUM(imp_count) AS imp_this_day
    ,COUNT(DISTINCT(user_id)) AS users_this_day
    ,( SUM(imp_count) / COUNT(DISTINCT(user_id)) ) AS imp_per_user
FROM   jobs
WHERE  country = 'US'
GROUP  BY imp_date;  

+-------------+---------------+-----------------+--------------+
|  imp_date   | imp_this_day  | users_this_day  | imp_per_user |
+-------------+---------------+-----------------+--------------+
| 2020-01-03  |            1  |              1  |       1.0000 |
| 2020-01-06  |            5  |              1  |       5.0000 |
| 2020-01-13  |           22  |              3  |       7.3333 |
|        ...  |          ...  |            ...  |          ... |
+-------------+---------------+-----------------+--------------+
-- BETWEEN TWO DATE
SELECT SUM(imp_count) AS imp_this_day
    ,COUNT(DISTINCT(user_id)) AS users_this_period
    ,( SUM(imp_count) / COUNT(DISTINCT(user_id)) ) AS imp_per_user
FROM   jobs
WHERE  country = 'US'
    and imp_date>="2020-01-14"
    and imp_date<="2020-01-15";


+------------------+--------------------+--------------+
| imp_this_period  | users_this_period  | imp_per_user |
+------------------+--------------------+--------------+
|              13  |                 2  |       6.5000 |
+------------------+--------------------+--------------+
-- WEEKLY
SELECT WEEK(ANY_VALUE(imp_date)) as week_num
        ,Sum(imp_count) AS imp_this_week
        ,Count(DISTINCT(user_id)) AS users_this_week
        ,( Sum(imp_count) / Count(DISTINCT(user_id)) ) AS imp_per_user
FROM   jobs
WHERE  country = 'US'
GROUP BY week_num; 


+-----------+----------------+------------------+--------------+
| week_num  | imp_this_week  | users_this_week  | imp_per_user |
+-----------+----------------+------------------+--------------+
|        0  |             1  |               1  |       1.0000 |
|        1  |             5  |               1  |       5.0000 |
|        2  |            40  |               4  |      10.0000 |
+-----------+----------------+------------------+--------------+
-- MONTHLY
SELECT MONTH(ANY_VALUE(imp_date)) as month_num
        ,Sum(imp_count) AS imp_this_month
        ,Count(DISTINCT(user_id)) AS users_this_month
        ,( Sum(imp_count) / Count(DISTINCT(user_id)) ) AS imp_per_user
FROM   jobs
WHERE  country = 'US'
GROUP BY month_num; 


+------------+-----------------+-------------------+--------------+
| month_num  | imp_this_month  | users_this_month  | imp_per_user |
+------------+-----------------+-------------------+--------------+
|         1  |             46  |                4  |      11.5000 |
+------------+-----------------+-------------------+--------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...