有人可以帮我一些疑问吗?
所以我试图查看用户在该月的行为。我试图按用户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个活动。
答案 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