Аналитика в sql - PullRequest
       7

Аналитика в sql

0 голосов
/ 09 февраля 2019

У меня есть таблица со следующей структурой: use_id (int) - event (str) - time (timestamp) - value (int)

Событие может принимать несколько значений: установить, войти, купить и т. Д.

Мне нужно получить все пользовательские записи перед обновлениемприложение.Например, момент выхода моего приложения - 1 января 2019 года, но пользователи могут установить новую версию в любой день.

Как мне получить sum(value) по первой и второй версиям.---------

Я попытался самостоятельно объединить таблицу, но думаю, что это не лучшее решение.

Помогите, пожалуйста.

1 Ответ

0 голосов
/ 09 февраля 2019

Вот определение вашей таблицы (как я понял из ваших комментариев и описания):

CREATE TABLE user_events (
   user_id integer,
   event varchar,
  time timestamp without time zone,
  value integer
);

Вот запрос, который вы просили:

SELECT
    COUNT(user_id),
    SUM(value)
FROM (
    SELECT 
        DISTINCT ON (user_id)
        user_id,time,value
    FROM user_events
    WHERE event='install'
    ORDER BY user_id, time DESC
) last_installations
WHERE 
    time BETWEEN date '2018-01-01' AND date '2019-01-01';

Некоторые пояснения:

  • внутренний запрос (last_installations) выбирает события последней установки для каждого пользователя
  • внешний запрос отфильтровывает только установки первой и второй версий и вычисляет SUM(value) (по мереспросил) и COUNT(user_id) (я добавил для ясности - сколько пользователей сейчас используют версии 1 и 2)

ОБНОВЛЕНИЕ

сумма значений для всех событий по версии

SELECT 
    event,
    CASE 
        WHEN  time BETWEEN date '2018-01-01' AND timestamp '2018-05-30 23:59:59' THEN 1
        WHEN  time BETWEEN date '2018-06-01' AND timestamp '2018-12-31 23:59:59' THEN 2
        WHEN  time > date '2018-01-01'                                           THEN 3
        ELSE 0 -- unknown version 
    END AS version,
    SUM(value)
FROM user_events
GROUP BY 1,2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...