Postgres: подсчитать количество действий пользователей за промежуток времени - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь подсчитать тип DAU по заданным действиям, когда пользователи делятся на категории по количеству своих действий в течение определенного интервала.

Пример необработанных данных:

date        user_id   amount_actions
2018-12-01  1         2      
2018-12-02  1         1
2018-12-10  1         1
2018-12-01  2         2      
2018-12-02  2         1
2018-12-10  3         1

Таблица результатов, которую я хотел бы иметь:

date        user_id   amount_actions rolling_sum_7_days
2018-12-01  1         2              2
2018-12-02  1         1              3
2018-12-10  1         1              1
2018-12-01  2         2              2
2018-12-12  2         1              1
2018-12-10  3         1              1
2018-12-15  3         1              2

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Использование совокупной суммы в Postgres:

select
    dt, user_id, amount_actions,
    to_char(dt, 'WWYYYY') wk,
    sum(amount_actions) 
        over 
        (partition by user_id, to_char(dt, 'WWYYYY')
         order by user_id, dt) rolling_sum_7_days
from
    tbl
order by user_id, dt;

Раздел: user_id + WeekYear to_char (dt, 'WWYYYY')

dt         | user_id | amount_actions | wk     | rolling_sum_7_days
:--------- | ------: | -------------: | :----- | -----------------:
2018-12-01 |       1 |              2 | 482018 |                  2
2018-12-02 |       1 |              1 | 482018 |                  3
2018-12-10 |       1 |              1 | 502018 |                  1
2018-12-01 |       2 |              2 | 482018 |                  2
2018-12-02 |       2 |              1 | 482018 |                  3
2018-12-10 |       3 |              1 | 502018 |                  1

дБ <> скрипка здесь

0 голосов
/ 27 декабря 2018

Можно выполнить боковое объединение, которое вычисляет сумму действий для этого пользователя за последние семь дней:

select  date
,       user_id
,       amount_actions
,       sum_actions
from    YourTable yt1
cross join lateral
        (
        select  sum(amount_actions) as sum_actions
        from    YourTable yt2
        where   yt1.user_id = yt2.user_id
                and yt1.date - interval '7 days' < yt2.date
                and yt2.date <= yt1.date
        ) sum_actions

Рабочий пример на rextester.

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