【问题标题】:Google Big Query SQL TOP/Max/Order byGoogle Big Query SQL TOP/Max/Order by
【发布时间】:2015-11-04 23:41:32
【问题描述】:

这是我的有效查询:

选择 a_name、w_name、page_url、SUM(IF(result = 'WIN', 1, 0)) 作为展示次数,

来自 TABLE_DATE_RANGE(v3_data.v3_,TIMESTAMP('2015-08-05'),TIMESTAMP('2015-08-07'))

WHERE server ="server1" 和 w_id IN (1096, 1105, 1136,1153,1189,1209)

按 1、2、3 分组

ORDER BY Impressions DESC

限制 1000000

现在我的问题是我不想使用限制。

我想做的是从每个 w_id 中选择前 1000 个结果,按展示次数排序。

有多个 w_id,这个查询也将扩展到多个服务器。

本来我以为我试试:

从 [上面的代码] 中选择前 1000 个 * 按 1,2,3 分组

但是 top 在大查询中不会像那样工作,如果我这样做了,它不会为每个 w_id 选择前 1000 个它会在整个集合中执行它,所以如果它们都是 w_id 1209,我将无法获得任何结果相对较小。

我希望这是足够的信息,我在这里因为含糊不清而得到了很多支持,但我试图提供尽可能多的细节并尽可能合乎逻辑。 提前致谢

【问题讨论】:

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


    【解决方案1】:

    BigQuery 支持ROW_NUMBER(),这是您轻松执行此操作所需的功能。

    您确实需要在group by 中包含w_id,但我认为以下内容应该可以满足您的需求:

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

    【讨论】:

    • 谢谢,不幸的是,我仍然收到错误:查询执行期间超出资源 - 我也将顺序按位更改为印象数,因为它已经定义并且它们不能按 SUM 排序
    • 我还删除了开头的 t.* 和结尾的 t,您能解释一下为什么要放入(我都尝试过),因为我从未见过这样做
    • @Oliver 。 . . t 只是一个表别名,一些数据库需要,通常是个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多