【发布时间】:2014-06-02 20:42:58
【问题描述】:
我有一个查询,可以找到用户“最后”一天的所有事件(即 2 周以上没有再次出现)。我想将其缩减为他们在离开之前执行的最后 N 个事件,按最近到最近的顺序排列。
我没有问题地创建了一个无序表,但是当我尝试 ORDER BY timestamp DESC 时,它会给我一个“响应太大而无法返回”错误。 为什么我在尝试排序(没有 GROUP BY 或其他任何内容)时出现此错误,但在无序表上却没有?
已编辑以在下方添加查询
此查询为我提供了一个表格,其中包含过去 14 天内未出现的用户的事件。
SELECT user.user_key as user_key, user.lastTime as lastTime, evt.actiontime as actiontime, evt.actiontype as actiontype, evt.action_parameters.parameter_name as actionParameterName
FROM (
SELECT user_key , MAX(actiontime) AS lastTime, DATE(MAX(actiontime)) as lastDate
FROM [db.action_log]
WHERE DATEDIFF(CURRENT_TIMESTAMP(), actiontime) >= 14
GROUP EACH BY user_key
HAVING DATEDIFF(CURRENT_TIMESTAMP(), lastTime) >= 14) as user
JOIN EACH(
SELECT user_key, actiontime, actiontype, action_parameters.parameter_name, DATE(actiontime) as actionDate
FROM [db.action_log]
WHERE DATEDIFF(CURRENT_TIMESTAMP(), actiontime) >= 14) as evt
ON (user.user_key = evt.user_key) AND (user.lastDate = evt.actionDate)
WHERE actiontime <= lastTime;
这运行得很好。我想 GROUP_CONCAT() 将动作变成一个列表,但首先我需要按动作时间(降序)排序,以便最近的事件是列表中的第一个。但是当我运行时:
SELECT user_key, lastTime, actiontime, user_level, actiontype, actionParameterName
FROM [db.lastActions]
ORDER BY actiontime DESC;
我收到“响应太大而无法返回”。
【问题讨论】:
-
如果可能的话,请包括一个查询,更多的人将能够提供帮助。或者工作 ID,如果它看起来像团队应该调试的错误,但在 StackOverflow 上更喜欢社区方法。
-
好点,最初应该包括这些。在初始帖子中编辑的查询。
-
排序作为一项操作不是分布式的,因此它仅限于一个节点中可以容纳的所有数据。为了测试这一点,您能否检查在过滤掉一大块原始数据时是否运行相同的查询?
-
我尝试使用 HASH 进行过滤。如果我做 WHERE HASH(user_key) % 100 = 0,这工作正常。如果我执行 HASH(user_key) % 100
标签: google-bigquery