Google Big Query SQL TOP / Max / Order by

时间:2015-08-12 11:29:55

标签: sql google-bigquery sql-order-by

这是我的查询:

  

选择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,我就不会得到任何结果相对较小。

我希望这是足够的信息,我已经被赋予了很多关于模糊的东西,但是我试图给出尽可能多的细节并且尽可能合乎逻辑。 提前致谢

1 个答案:

答案 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(),则可能需要额外的聚合层。