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

Google bigquery 滚动前几天在bigquery中也处于活动状态的活动用户,google-bigquery,window-functions,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 | user

我想计算在过去的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     |
我曾尝试使用聚合函数按日期对用户id进行分组,并使用窗口函数对前面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            |

你可能是对的,有一些合适的窗口函数来实现这一点,但我不熟悉他们,如果有

但是,由于没有现有的解决方案,这里有一个仅使用联接的工作方法:

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
通过编辑第二个
count(distinct…
语句中的
date\u sub
函数和case语句,您可以实现一些可选逻辑


希望这能有所帮助。

您可能是对的,有一些合适的窗口函数可以实现这一点,但如果有的话,我对它们并不熟悉

但是,由于没有现有的解决方案,这里有一个仅使用联接的工作方法:

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
通过编辑第二个
count(distinct…
语句中的
date\u sub
函数和case语句,您可以实现一些可选逻辑


希望这能有所帮助。

太好了,非常感谢。然后我将停止追逐分析函数,转而使用联接方法。太好了,非常感谢。然后我将停止追逐分析函数,转而使用联接方法。