【问题标题】:BigQuery RANK() in Having or Where ClauseBigQuery RANK() 在拥有或在哪里子句
【发布时间】:2014-04-25 14:43:02
【问题描述】:

在 BigQuery 中,我有一个查询,它使用 RANK() 函数按来源的总数对用户进行分组。我只关心前 10 名用户。目前,我在子选择中使用WHERE 子句在父查询中执行RANK() 函数以限制结果。有人可以向我解释如何在没有父查询的情况下完成此操作吗?我想运行的查询如下所示:

SELECT source, user, count( tweet_id ) as total, max( friends ) as friends, 
RANK() OVER (PARTITION BY source ORDER BY total DESC, friends DESC ) as user_rank
FROM tweets
GROUP BY source, user
HAVING user_rank <= 10

但我得到错误:在表“tweets”中找不到字段“user_rank”。我可以 ORDER BY 使用 user_rank,只是不过滤。

感谢您的任何建议!

【问题讨论】:

    标签: java sql google-app-engine google-bigquery


    【解决方案1】:

    你可能需要做类似的事情

    SELECT source, user, total, friends, user_rank
    
    FROM (
        SELECT source, user, count( tweet_id ) as total, max( friends ) as friends, 
        RANK() OVER (PARTITION BY source ORDER BY total DESC, friends DESC ) as user_rank
        FROM tweets
        GROUP BY source, user
    ) 
    
    HAVING user_rank <= 10
    

    【讨论】:

    • 感谢您的代码,这实际上就是我目前正在做的事情。缺点是子查询返回约 500k 行,我想看看是否有更好的方法来做到这一点。试图阻止 GROUP EACH BY 警告。
    • 为什么 500k 行是个问题?您可以将 group by 移动到外部查询并将必须更改为 where 以便它首先过滤吗?
    • 嘿乔丹,我只是想避免GROUP EACH BY 声明。目前一切正常,但我的印象是GROUP EACH BY 不是最好的?
    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 2011-02-23
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多