Решение комплексной проблемы агрегации SQL с несколькими событиями - PullRequest
0 голосов
/ 22 февраля 2020

Короче говоря, я провалил следующую тестовую оценку некоторое время go. Хотите, наконец, понять, как ее решить.

player_id: int game_id: int event_type: varchar (64) event_time: timestamp

store_game_install : указанный игрок выполнил начальная установка указанной игры

store_game_update : указанный игрок выполнил обновление указанной игры

store_open : указанный игрок запустил клиент игрового магазина на устройстве store_deleted : указанный игрок удалил клиент игрового магазина на устройстве store_game_download : указанный игрок загрузил игровой пакет, так как фактическая установка игры должна быть выведенным из store_game_view, за которым следует store_game_download.

С другой стороны, более поздние версии клиента хранилища перестали генерировать событие store_game_download.

Мне пришлось создать одну инструкцию MySql / PostgreSQL, производящую следующую агрегацию:

game_id => идентификатор игры

game_views => Общее количество игр подробные виды для этой

game_installs => Общее количество установок игры для этой игры

ЛЮБАЯ помощь будет означать мир. Спасибо!

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

В MySQL он будет примерно таким же, как @GMB, показанный для Postgres

SELECT
    `app_id`,
    SUM(`event_type` = 'store_app_view') app_views,
    SUM(`event_type` = 'store_app_install') app_installs,
    (SUM(`event_type` = 'store_app_install') / SUM(`event_type` = 'store_app_view')) app_conversion_rate
FROM `events_db`
GROUP BY `app_id`

https://www.db-fiddle.com/f/o8JoQHDxdLoSRrvMhoveMe/1

1 голос
/ 22 февраля 2020

Вы можете выполнить условное агрегирование.

В Postgres:

select
    app_id,
    count(*) filter(where event_type = 'store_app_view') app_views,
    count(*) filter(where event_type = 'store_app_install') app_installs
    count(*) filter(where event_type = 'store_app_install')
        / count(*) filter(where event_type = 'store_app_view') app_conversion_rate
from events_db
group by app_id

Реализация логики c для определения установок магазина для старых версий приложения немного сложнее , Для этого одним из методов является использование оконных функций:

select
    app_id,
    count(*) filter(where event_type = 'store_app_view') app_views,
    count(*) filter(where event_type = 'store_app_install' or event_type = 'store_app_view' and lead_event_type = 'store_app_download') app_installs
    count(*) filter(where event_type = 'store_app_install' or event_type = 'store_app_view' and lead_event_type = 'store_app_download')
        / count(*) filter(where event_type = 'store_app_View') app_conversion_rate

from (
    select
        e.*,
        lead(event_type) over(partition by user_id order by event_type) lead_event_type
    from events_db e
) t
group by app_id
...