滚动前几天在bigquery中也处于活动状态的活动用户

时间:2019-04-09 10:03:44

标签: google-bigquery window-functions

我想计算前y天也活跃过x次或多次的活跃用户的滚动数。为了简单起见,请在5天内说3次以上

我的数据的格式为

|    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进行分组,并且使用window函数对前5行中存在3次以上的用户进行汇总。 按日期汇总用户可以使用:

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            |

1 个答案:

答案 0 :(得分:0)

您可能是对的,有一些合适的窗口函数可以实现此目的,但是我不熟悉它们。

但是,由于没有现有的解决方案,因此这是一种仅使用联接的有效方法:

WITH ACTIVE_DAYS AS (
  SELECT
    a.date,
    a.user_id,
    COUNT(DISTINCT b.date) AS ActiveDays
  FROM
    DATA a
  JOIN
    DATA b
  ON
    a.user_id = b.user_id
    AND b.date BETWEEN DATE_SUB(a.date, INTERVAL 5 DAY) AND DATE_SUB(a.date, INTERVAL 1 DAY)
  GROUP BY
    1,
    2)
SELECT
  a.date,
  COUNT(DISTINCT a.user_id) AS DAU,
  COUNT(DISTINCT (CASE WHEN b.ActiveDays >= 3 THEN a.user_id END)) AS DAU_Meet_Criteria
FROM
  DATA a
LEFT JOIN
  ACTIVE_DAYS b
ON
  a.date = b.date
  AND a.user_id = b.user_id
GROUP BY
  1
ORDER BY
  1

通过编辑date_sub函数和第二条count(distinct...语句中的case语句,您可以实现一些替代逻辑。

希望这会有所帮助。