BigQuery RANK() 在拥有或在哪里子句

Posted

技术标签:

【中文标题】BigQuery RANK() 在拥有或在哪里子句【英文标题】:BigQuery RANK() in Having or Where Clause 【发布时间】: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,只是不过滤。

感谢您的任何建议!

【问题讨论】:

【参考方案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 不是最好的?

以上是关于BigQuery RANK() 在拥有或在哪里子句的主要内容,如果未能解决你的问题,请参考以下文章

bigquery 分区表的分区修剪

是否可以在 Union All BigQuery SQL 中让 where 子句引用另一个 where 子句?

BigQuery 重复的 rank() 数字

在 C# LINQ 中实现 RANK OVER SQL 子句

MySQL中带有Order By子句的Rank函数

所选项目不必出现在 GROUP BY 子句中或在聚合函数中使用