我有一个查询,查找用户“最后”一天的所有事件(即,不会再显示2周以上)。我想把它减少到他们在离开之前执行的最后N个事件,按照最近到最近的顺序。
我创建了一个没有问题的无序表,但是当我尝试 ORDER BY时间戳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;
我得到“响应太大而无法返回。”
答案 0 :(得分:0)
当您在单个查询中有太多group, order and group_concats
组合时,BQ有时会大声喊叫
但是,我认为直接group_concat
不会创建一个有序列表,因此在concat之前执行order by
在这种情况下基本上没有意义。 This question应该解决您的问题
为了完成起见,我找到了几种有用的方法来避免(无论出于何种原因)大声喊叫:
1)尽可能将脚本分成更小的段。这样,如果您正在玩数据,就可以获得更多控制权
2)而不是使用order by
然后使用limit
,它会更快,在使用更多语句时可能更有用。
3)明智地使用子选择。例如,首先分组然后排序应该总是比首先排序更快。