Sql 在google big query中计算每周保留率

Sql 在google big query中计算每周保留率,sql,google-bigquery,Sql,Google Bigquery,我在google big query中有一个大表,有两列我想对其执行保留:- 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 2

我在google big query中有一个大表,有两列我想对其执行保留:-

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% 
我希望在一个月或6个月这样的时间范围内执行此操作,无论我选择什么时间范围,输出都应采用上述格式


我想要一个大查询的解决方案,但即使是MySQL解决方案也会对我有所帮助。

这里有一个可能的解决方案:

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”)。

为什么使用mysql/sql标记?因为查询仅在sql/mysql中。即使是mysql/sql解决方案也适用于我。好吧,定义一个从7天开始的“一周”是第一周,依此类推。还有(最后?),你使用的是什么版本的mysql?注意:既然你提到的时间框架是6个月或更短,我没有考虑一年的时间,我可以给出我的时间框架,同时询问……它永远不会太大,但是如果我可以说我想要从这个日期到这个日期的结果。当然,你只需要在“引线”的定义中,在“2021-01-01”和“2021-03-31”之间添加过滤器“哪里<代码>日期<代码>。这里的临时表不知道我们如何在日常保留中实现相同的功能@Cyllby这也让我从第4周开始保持记忆,你知道为什么第12周和第3周没有出现吗