这是我的查询:
选择a_name,w_name,page_url,SUM(IF(结果='WIN',1,0))作为展示次数,
来自TABLE_DATE_RANGE(v3_data.v3_,TIMESTAMP('2015-08-05'),TIMESTAMP('2015-08-07'))
WHERE server =“server1”and w_id IN(1096,1105,1136,1153,1189,1209)
GROUP EACH BY 1,2,3
ORDER BY Impressions DESC
限制1000000
现在我的问题是我不想使用限制。
我想要做的是选择每个w_id的前1000个结果,按展示次数排序。
有多个w_ids,此查询也将扩展到多个服务器。
最初我认为id尝试:
从[上面的代码]组中选择前1000 * * 1,2,3
但是top在大查询中不会像那样工作,如果我这样做,它就不会为每个w_id选择前1000个,它会在整个集合中做到这一点,所以如果它们都是w_id 1209,我就不会得到任何结果相对较小。
我希望这是足够的信息,我已经被赋予了很多关于模糊的东西,但是我试图给出尽可能多的细节并且尽可能合乎逻辑。 提前致谢
答案 0 :(得分:1)
BigQuery支持ROW_NUMBER()
,这是您轻松完成此任务所需的功能。
您需要在w_id
中加入group by
,但我认为以下内容应该符合您的要求:
SELECT t.*
FROM (SELECT a_name, w_name, page_url,
SUM(IF(result = 'WIN', 1, 0)) as Impressions,
ROW_NUMBER() OVER (PARTITION BY w_id
ORDER BY SUM(IF(result = 'WIN', 1, 0)) DESC
) as seqnum
from TABLE_DATE_RANGE(v3_data.v3_, TIMESTAMP('2015-08-05'), TIMESTAMP('2015-08-07'))
WHERE server = 'server1' and w_id IN (1096, 1105, 1136, 1153, 1189, 1209)
GROUP EACH BY 1, 2, 3, w_id
) t
WHERE seqnum <= 1000;
如果BigQuery在聚合中不支持row_number()
,则可能需要额外的聚合层。