按天滚动30天唯一身份用户计数bigquery

时间:2020-09-02 16:52:38

标签: sql google-bigquery

我正在尝试使用此查询生成每天滚动30天的唯一计数的一天,但是问题是在一天中运行此查询的一天,因此我需要在一个脚本中使用整月滚动30天每天计数的脚本

-----------------------------------------
SELECT  max(date),count(DISTINCT user_id) as MAU
FROM user_data  
WHERE date between DATE_SUB('2020-08-31' ,INTERVAL  29 DAY) and '2020-08-31';

3 个答案:

答案 0 :(得分:0)

BigQuery不支持count(distinct)的滚动窗口。因此,一种方法是蛮力方法:

select dte,
       (select count(distinct ud.user_id)
        from user_data ud
        where ud.date between DATE_SUB(dte, INTERVAL 29 DAY) and dte
       ) as num_users
from unnest(generate_date_array(date('2020-08-01'), date('2020-08-31'))) dte

答案 1 :(得分:0)

戈登方法效果很好。 如果您需要计算更多数字,请交叉连接数据。

SELECT 
  date_gen,
  COUNT(DISTINCT IF(ud.date BETWEEN DATE_SUB(date_gen ,INTERVAL 29 DAY) AND date_gen,ud.user_id,NULL)) as MAU
FROM 
  UNNEST(GENERATE_DATE_ARRAY(DATE_SUB('2020-08-31' ,INTERVAL 29 DAY), date('2020-08-31'))) date_gen,
  (SELECT * FROM user_data WHERE date BETWEEN DATE_SUB('2020-08-31' ,INTERVAL 60 DAY) AND '2020-08-31') AS ud
GROUP BY 1
ORDER BY 1 DESC

使用SET和DECLARE,您可以摆脱多次替换“ DATE”的麻烦。

答案 2 :(得分:0)

以下是用于BigQuery标准SQL

#standardSQL
SELECT date, (SELECT COUNT(DISTINCT id) FROM t.users AS id) AS MAU
FROM (
  SELECT date, ARRAY_AGG(user_id) OVER(mau_win) users
  FROM `project.dataset.user_data`  
  WINDOW mau_win AS (
    ORDER BY UNIX_DATE(date) DESC RANGE BETWEEN CURRENT ROW AND 29 FOLLOWING
  )
) t

上文假设您在project.dataset.user_data表中有自己感兴趣的时间段的所有记录

如果不是这种情况,并且您的数据中确实存在空白-您可以在下面使用

#standardSQL
SELECT date, (SELECT COUNT(DISTINCT id) FROM t.users AS id) AS MAU
FROM (
  SELECT date, ARRAY_AGG(user_id) OVER(mau_win) users
  FROM UNNEST(GENERATE_DATE_ARRAY('2020-08-01', '2020-08-31')) AS date
  LEFT JOIN `project.dataset.user_data`  
  USING(date)
  WINDOW mau_win AS (
    ORDER BY UNIX_DATE(date) DESC RANGE BETWEEN CURRENT ROW AND 29 FOLLOWING
  )
) t