计算谷歌大查询中的每周留存率

Posted

技术标签:

【中文标题】计算谷歌大查询中的每周留存率【英文标题】:Calculate weekly retention in google big query 【发布时间】:2021-04-12 14:00:41 【问题描述】:

我在谷歌大查询中有一个大表,我想在两列上执行保留:-

Date                           user
2021-02-03 08:35:07 UTC        foo@abc.com
2021-02-03 08:35:07 UTC        foo1@abc.com
2021-02-04 08:35:07 UTC        foo2@abc.com
2021-02-05 08:35:07 UTC        foo@abc.com
2021-02-03 08:35:07 UTC        foo1@abc.com
2021-02-10 08:35:07 UTC        foo@abc.com
2021-02-13 08:35:07 UTC        foo1@abc.com
2021-02-18 08:35:07 UTC        foo3@abc.com
2021-02-21 08:35:07 UTC        foo2@abc.com
2021-02-23 08:35:07 UTC        foo2@abc.com
2021-02-24 08:35:07 UTC        foo5@abc.com
2021-02-24 08:35:07 UTC        foo2@abc.com

我想在以下条件下计算留存率:-

第 1 周的唯一身份用户在第 2 周出现的百分比

第 2 周的唯一身份用户在第 3 周出现的百分比,依此类推。

所需的输出格式为:-

week2  week3   week4 
23%    56%     33% 

我想在 1 个月或 6 个月的时间范围内执行此操作,无论我选择什么时间范围,输出都应采用上述格式。

我想要一个 Big Query 解决方案,但即使是 mysql 解决方案也能帮到我。

【问题讨论】:

为什么是 mysql/sql 标签? 因为查询仅在 sql/mysql 中。即使是 mysql/sql 解决方案也适合我。 好的,定义一个“星期” 开始7天是第一周,以此类推。 还有(最后?),您使用的是什么版本的 MySQL? 【参考方案1】:

这是一个可能的解决方案:

WITH leads AS (
      SELECT
        user,
        EXTRACT(ISOWEEK
        FROM
          `Date`) AS visit_week,
        EXTRACT(ISOWEEK
        FROM
          LEAD(`Date`) OVER (PARTITION BY user ORDER BY `Date`)) AS next_visit_week
         -- here you look the user's next visit and take the week. If the user is there the following week, next_visit_week = visit_week + 1
      FROM
        `your_project`.`your_dataset`.`your_table`)


SELECT
  visit_week+1 AS `week`,
  SUM(CASE 
        WHEN visit_week= next_visit_week-1 
        THEN 1 
        ELSE 0 
    END
    )/COUNT(DISTINCT user)*100 AS retention_pct
FROM
  leads
GROUP BY
  `visit_week`

对于每周,您计算用户下一次访问在当前周之后的一周发生的次数(注意:每个用户只能发生一次)。您将总数除以不同用户的数量。

因此,您获得了下一周的保留率(因此“visit_week+1 AS week”中的“+1”)。

【讨论】:

注意:因为你提到的时间范围是 6 个月或更短,所以我没有考虑年份 有没有办法在查询时给出我的时间范围......它永远不会太大,但如果我可以说我想要从这个日期到这个日期的结果。 当然,您只需要在“leads”临时表的定义中添加过滤器“ WHERE Date BETWEEN "2021-01-01" AND "2021-03-31" "这里 嘿任何想法我们如何为每日保留实施相同的。 @Cylldby 另外,它让我从第 4 周开始留存,知道为什么第 1 周、第 2 周和第 3 周不存在

以上是关于计算谷歌大查询中的每周留存率的主要内容,如果未能解决你的问题,请参考以下文章

BigRQuery 如何更新谷歌大查询表中的列?

谷歌大查询:需要帮助将 Postgres 查询转换为谷歌大查询

左连接以填充谷歌大查询中 2 个表中的数据

谷歌大查询或任何数据库中的分区视图(联合所有视图)

关于数据框中的日期时间与谷歌大查询中的日期时间的问题

Java - 一次插入一行到谷歌大查询?