如何获得每个用户的最近7个活动

时间:2018-11-30 03:39:28

标签: sql google-bigquery

有人可以帮我一些疑问吗?

所以我试图查看用户在该月的行为。我试图按用户ID排序所有数据,但bigquery说:

  

查询执行期间超出了资源:无法在分配的内存中执行查询。高峰使用:限制的107%。内存消耗大户:ORDER BY操作:100%。

因此,我正在考虑只获取用户的最后10个活动。 例如,我有:

UserID        timestamp
123           28-Nov-2018
123           28-Nov-2018
123           28-Nov-2018
123           28-Nov-2018
123           27-Nov-2018
123           26-Nov-2018
123           20-Nov-2018
123           08-Nov-2018
123           08-Nov-2018
123           07-Nov-2018
123           05-Nov-2018
123           03-Nov-2018
234           28-Nov-2018
234           26-Nov-2018
234           25-Nov-2018
234           24-Nov-2018
234           24-Nov-2018

因此结果将是:

 UserID        timestamp
 123           28-Nov-2018
 123           28-Nov-2018
 123           28-Nov-2018
 123           28-Nov-2018
 123           27-Nov-2018
 123           26-Nov-2018
 123           20-Nov-2018
 123           08-Nov-2018
 123           08-Nov-2018
 123           07-Nov-2018
 234           28-Nov-2018
 234           26-Nov-2018
 234           25-Nov-2018
 234           24-Nov-2018
 234           24-Nov-2018

由于捕获的用户234的所有活动少于10,因此我应该只获取用户123的最后10个活动。

2 个答案:

答案 0 :(得分:0)

这确实可以工作:

        create table d061_userid (userid number,tt date);
        //do inserts 
        select * from d061_userid;
123 28-NOV-18
123 28-NOV-18
123 28-NOV-18
123 28-NOV-18
123 27-NOV-18
123 20-NOV-18
123 08-NOV-18
123 08-NOV-18
123 07-NOV-18
123 05-NOV-18
123 03-NOV-18
234 28-NOV-18
234 26-NOV-18
234 25-NOV-18
234 24-NOV-18

  select a.userID,a.tt from (select userID, tt,
  row_number() over (partition by userID order by tt desc) rank
  from d061_userid
  ) a where rank<=7 ;


    output:
123 28-NOV-18
123 28-NOV-18
123 28-NOV-18
123 28-NOV-18
123 27-NOV-18
123 20-NOV-18
123 08-NOV-18
234 28-NOV-18
234 26-NOV-18
234 25-NOV-18
234 24-NOV-18
234 24-NOV-18

答案 1 :(得分:0)

  

每位用户最近7项活动

以下内容适用于BigQuery Standard SQL,并且应解决资源超出错误的错误,该错误通常与将ROW_NUMBER()或RANK()与ORDER BY函数类型相关联

注意:根据您的示例,我假设您的时间戳列的数据类型实际上是STRING,所以我正在使用PARSE_DATE()函数将其转换为DATE类型

#standardSQL
SELECT UserID, ts FROM (
  SELECT UserID, ARRAY_AGG(ts ORDER BY PARSE_DATE('%d-%b-%Y', ts) DESC LIMIT 7) arr
  FROM `project.dataset.table`
  GROUP BY UserID
), UNNEST(arr) ts

您可以使用虚拟数据测试,玩游戏,如您的问题所示:

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 123 UserID, '28-Nov-2018' ts UNION ALL
  SELECT 123, '28-Nov-2018' UNION ALL
  SELECT 123, '28-Nov-2018' UNION ALL
  SELECT 123, '28-Nov-2018' UNION ALL
  SELECT 123, '27-Nov-2018' UNION ALL
  SELECT 123, '26-Nov-2018' UNION ALL
  SELECT 123, '20-Nov-2018' UNION ALL
  SELECT 123, '08-Nov-2018' UNION ALL
  SELECT 123, '08-Nov-2018' UNION ALL
  SELECT 123, '07-Nov-2018' UNION ALL
  SELECT 123, '05-Nov-2018' UNION ALL
  SELECT 123, '03-Nov-2018' UNION ALL
  SELECT 234, '28-Nov-2018' UNION ALL
  SELECT 234, '26-Nov-2018' UNION ALL
  SELECT 234, '25-Nov-2018' UNION ALL
  SELECT 234, '24-Nov-2018' UNION ALL
  SELECT 234, '24-Nov-2018' 
)
SELECT UserID, ts FROM (
  SELECT UserID, ARRAY_AGG(ts ORDER BY PARSE_DATE('%d-%b-%Y', ts) DESC LIMIT 7) arr
  FROM `project.dataset.table`
  GROUP BY UserID
), UNNEST(arr) ts
ORDER BY UserID, PARSE_DATE('%d-%b-%Y', ts) DESC   

有结果

Row UserID  ts   
1   123     28-Nov-2018  
2   123     28-Nov-2018  
3   123     28-Nov-2018  
4   123     28-Nov-2018  
5   123     27-Nov-2018  
6   123     26-Nov-2018  
7   123     20-Nov-2018  
8   234     28-Nov-2018  
9   234     26-Nov-2018  
10  234     25-Nov-2018  
11  234     24-Nov-2018  
12  234     24-Nov-2018