Bigquery:选择具有不在group by子句中的任何值的列

Posted

技术标签:

【中文标题】Bigquery:选择具有不在group by子句中的任何值的列【英文标题】:Bigquery: Select a column with any value not in group by clause 【发布时间】:2015-04-05 20:16:36 【问题描述】:

这是一个经典问题,我知道这里有很多解决方法:Select a Column in SQL not in Group By 但它们不适用于我在 Bigquery 上的问题。

我有一张来自 Twitter 的推文的表格,我想要一个包含任何推文文本的 url 排名。

ID         tweet               url
1          my github tweet     http://www.github.com/xyz
2          RT github tweet     http://www.github.com/xyz
3          another tweet       http://www.twitter.com
4          more tweeting       http://www.github.com/abc

我尝试了下面的查询,但是 id 1 和 2 是分开计算的。

SELECT tweet, count(url) as popularity, url FROM table group by tweet, url order by popularity desc

我怎样才能正确计算/排列网址,并在结果中保留任何相关的推文文本?我不在乎它是来自 ID 1 还是 2。

【问题讨论】:

【参考方案1】:

这是一种方法:

SELECT url, COUNT(*) AS popularity, GROUP_CONCAT(tweet) 
FROM Table GROUP BY url ORDER BY popularity

GROUP_CONCAT 聚合函数将使用逗号作为分隔符连接与同一 URL 关联的所有推文(您可以选择另一个分隔符作为 GROUP_CONCAT 的第二个参数)。

【讨论】:

完美运行。我添加了一个 left() 来截断输出,对此我很满意。 @crisscross 如果你只想要一条推文,你也可以选择 url,COUNT(*) AS 流行度,MAX(tweet) FROM Table GROUP BY url ORDER BY 流行度(如果有,GROUP_CONCAT 会很困难推文太多,无法分组)【参考方案2】:

我不确定这是否适用于 google-bigquery,我没有使用过它的经验,但这是一个纯 sql 的解决方案,我认为它可能适合你。

在子查询中获取urls 的count,然后将joinurl 上的表一起获取:

select t.id,t.tweet,t.url,q.popularity
from table t
join 
(SELECT url, count(url) as popularity
FROM table group by url) q
on t.url=q.url
order by q.popularity desc

【讨论】:

非常感谢您的快速回复。它并没有完全像那样解决,但我很高兴看到有一个带有 join 语句的选项。

以上是关于Bigquery:选择具有不在group by子句中的任何值的列的主要内容,如果未能解决你的问题,请参考以下文章

选择不在 GROUP BY 子句中的列

我们如何在具有GROUP BY子句的查询中选择非聚合列,而GROUP BY子句在功能上不依赖于GROUP BY子句中的列?

only_full_group_by : "ORDER BY 子句不在 GROUP BY 子句中"

ORDER BY 子句的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列

MySQL 错误:SELECT 列表不在 GROUP BY 子句中

SELECT 列表不在 GROUP BY 子句中,并且包含非聚合列 [重复]