BIGQUERY: как запросить ежемесячный активный пользователь / отток пользователей - PullRequest
0 голосов
/ 11 июня 2019

Итак, у меня есть веб-сайт с новостными статьями, и я пытаюсь рассчитать 4 типа пользователей для каждого месяца. Типы пользователей:

1. Новый пользователь: Пользователь, который зарегистрировался (их первый просмотр статьи) в текущем месяце и просмотрел статью в текущем месяце.

2. Сохраненный пользователь: Новый пользователь за предыдущий месяц ИЛИ пользователь, который просматривал статью в предыдущем месяце и в текущем месяце.

3. Отклоненный пользователь: Новый пользователь или оставшийся пользователь из предыдущего месяца, который не просматривал статью в текущем месяце ИЛИ отбитый пользователь из предыдущего месяца.

4. Воскресший пользователь: Пользователь из числа пользователей предыдущего месяца, просмотревший статью в текущем месяце.

**User Table A - Unique User Article Views**
- Current month = 2019-04-01 00:00:00 UTC

| user_id    | viewed_at                 |
------------------------------------------
| 4          | 2019-04-01 00:00:00 UTC   |
| 3          | 2019-04-01 00:00:00 UTC   |
| 2          | 2019-04-01 00:00:00 UTC   |
| 1          | 2019-03-01 00:00:00 UTC   |
| 3          | 2019-03-01 00:00:00 UTC   |
| 2          | 2019-02-01 00:00:00 UTC   |
| 1          | 2019-02-01 00:00:00 UTC   |
| 1          | 2019-01-01 00:00:00 UTC   |


The table above outlines the following user types:

2019-01-01
* User 1: New

2019-02-01
* User 1: Retained
* User 2: New

2019-03-01
* User 1: Retained
* User 2: Churned
* User 3: New

2019-04-01
* User 1: Churned
* User 2: Resurrected
* User 3: Retained
* User 4: New

Моя желаемая таблица СЧИТАЕТ отдельный идентификатор_идентификатора для каждого типа пользователя в каждом месяце.

| month_viewed_at           | ut_new | ut_retained | ut_churned | ut_resurrected
------------------------------------------------------------------------------------
| 2019-04-01 00:00:00 UTC   | 1      | 1           | 1          | 1
| 2019-03-01 00:00:00 UTC   | 1      | 1           | 1          | 0
| 2019-02-01 00:00:00 UTC   | 1      | 1           | 0          | 0
| 2019-01-01 00:00:00 UTC   | 1      | 0           | 0          | 0 

1 Ответ

2 голосов
/ 12 июня 2019

Я просто не уверен, с чего начать

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

Ниже приведен стандарт SQL для BigQuery, и он должен указывать направление

#standardSQL
WITH temp1 AS (
  SELECT user_id,
    FORMAT_DATE('%Y-%m', DATE(viewed_at)) month_viewed_at, 
    DATE_DIFF(DATE(viewed_at), '2000-01-01', MONTH) pos,
    DATE_DIFF(DATE(MIN(viewed_at) OVER(PARTITION BY user_id)), '2000-01-01', MONTH) first_pos
  FROM `project.dataset.table`
), temp2 AS (
  SELECT *, pos = first_pos AS new_user
  FROM temp1
), temp3 AS (
  SELECT *, LAST_VALUE(new_user) OVER(win) OR pos - 1 = LAST_VALUE(pos) OVER(win) AS retained_user
  FROM temp2
  WINDOW win AS (PARTITION BY user_id ORDER BY pos RANGE BETWEEN 1 PRECEDING AND 1 PRECEDING)
)
SELECT month_viewed_at,
  COUNTIF(new_user) AS new_users,
  COUNTIF(retained_user) AS retained_users
FROM temp3
GROUP BY month_viewed_at
-- ORDER BY month_viewed_at DESC

Если применить к вашему образцу данных - результат

Row month_viewed_at new_users   retained_users   
1   2019-04         1           1    
2   2019-03         1           1    
3   2019-02         1           1    
4   2019-01         1           0    

В temp1 мы подготавливаем данные, форматируя просматриваемый_кат в необходимый формат для представления в выходном объявлении, а также преобразуем его в последовательный номер месяца, начиная с некоторых абстрактных данных (2000-02-02), чтобы мы могли использовать функцию аналитики с ДИАПАЗОН в отличие от ROWS
В temp2 мы просто идентифицируем новых пользователей, а в temp3 - оставшихся пользователей

Я думаю, это может быть хорошим началом, поэтому я оставляю остальное для вас

...