Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中计算同一表内的保留期_Sql_Google Bigquery - Fatal编程技术网

在SQL中计算同一表内的保留期

在SQL中计算同一表内的保留期,sql,google-bigquery,Sql,Google Bigquery,我有一个如下的SQL表:- Date domain user 2021-02-03 08:35:07 UTC abc foo@abc.com 我想计算保留率。例如,第一周的唯一用户总数(下周也会出现)或第1周的唯一用户百分比(第2周出现) 这将是伟大的,如果我可以计算出几个星期,如数月或6个月后提供的期限。即使是一个月也会对我有所帮助。您可以将每周的唯一用户聚合到数组中,然后计算本周用户与前一周用户之间的交集: with

我有一个如下的SQL表:-

Date                       domain     user
2021-02-03 08:35:07 UTC    abc        foo@abc.com
我想计算保留率。例如,第一周的唯一用户总数(下周也会出现)或第1周的唯一用户百分比(第2周出现)


这将是伟大的,如果我可以计算出几个星期,如数月或6个月后提供的期限。即使是一个月也会对我有所帮助。

您可以将每周的唯一用户聚合到数组中,然后计算本周用户与前一周用户之间的交集:

with mytable as (
  select timestamp '2021-02-03 08:35:07' as date, 'foo1@abc.com' as user union all
  select timestamp '2021-02-03 08:35:07' as date, 'foo2@abc.com' as user union all
  select timestamp '2021-02-10 08:35:07' as date, 'foo2@abc.com' as user union all
  select timestamp '2021-02-10 08:35:07' as date, 'foo3@abc.com' as user union all
  select timestamp '2021-02-10 08:35:07' as date, 'foo4@abc.com' as user union all
  select timestamp '2021-02-17 08:35:07' as date, 'foo3@abc.com' as user union all
  select timestamp '2021-02-17 08:35:07' as date, 'foo4@abc.com' as user union all
  select timestamp '2021-02-17 08:35:07' as date, 'foo5@abc.com' as user union all
  select timestamp '2021-02-24 08:35:07' as date, 'foo5@abc.com' as user
),
users_per_week as (
  select
    TIMESTAMP_TRUNC(date, WEEK) as week,
    ARRAY_AGG(DISTINCT user) as users
  from mytable
  group by week
),
with_prev_week_users as (
  select
    week,
    lag(users) over (order by week) as prev_users,
    users
  from users_per_week
)
select 
  week,
  prev_users,
  users,
  ARRAY_LENGTH(ARRAY(select * from unnest(prev_users) intersect distinct select * from unnest(users))) as retention,
from with_prev_week_users

你的问题相当广泛。你想要什么的具体例子会很有帮助-一个一致的数据库标签也是如此。日期列是一个时间序列,我想计算第一周有多少用户出现在第二周。或者第一周中第二周出现的唯一用户的百分比是多少。在前几行中,您在每一行上都执行union all,当您有数百万行时,您将执行什么操作。以及我如何在特定的时间段内运行此操作,因为我有多年的数据。例如,如果我想为3月、3月和4月或任何时间段/联合运行此功能,则所有功能都仅用于填充mytable,这只是一个示例输入数据。如果要为3月和4月运行此功能,只需在“用户每周”的“日期”列上添加筛选器,如:选择时间戳\u TRUNCdate,周为周,数组\u根据weekOne的最后一个问题,将不同的用户作为mytable中的用户,其中日期>=时间戳'2021-03-01 00:00:00'和日期<时间戳'2021-05-01 00:00:00'分组。我们可以从第1周到第2周再到第2周到第3周获得域名和保留率,因为我有数百万用户。域周1到第2周2到第3周foo 56%76%foo1 67%63%