Я хотел бы рассчитать текущее число активных пользователей, которые также были активными x или более раз за предыдущие y дней. Для простоты скажем> 3 раза за 5 дней
У меня есть данные
| date | user_id |
------------------
|2019-01-01 | user1 |
|2019-01-01 | user2 |
|2019-01-01 | user1 |
|2019-01-02 | user1 |
|2019-01-02 | user3 |
|2019-01-02 | user4 |
|2019-01-03 | user2 |
|2019-01-03 | user3 |
Я пытался использовать агрегатные функции для группировки user_id по дате, а наличие оконной функции суммирует пользователей, которые существуют> 3 раза в 5 предыдущих строках.
Агрегировать пользователей по дате можно, используя:
SELECT date, ARRAY_AGG(distinct user_id) as users
FROM `table`
WHERE date > DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
GROUP BY date
Возвращение структуры массива, как это.
| date | users |
------------------
|2019-01-01 | user1 |
| | user2 |
|2019-01-02 | user1 |
| | user3 |
| | user4 |
|2019-01-03 | user2 |
| | user3 |
Но здесь я застрял. Могу ли я сделать что-то подобное? Но какую аналитическую функцию я должен использовать?
WITH activity as (
SELECT date, ARRAY_AGG(distinct user_id) as users
FROM `table`
WHERE date > DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
GROUP BY date
)
SELECT date, xxxx OVER (PARTITION BY date ORDER BY date ROWS 5 PRECEDING) as returning_users
FROM activity
Вывод, который я хотел бы получить:
| date | returning_users |
------------------
|2019-01-01 | 123 |
|2019-01-02 | 1234 |
|2019-01-03 | 12345 |