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 的解决方案,我认为它可能适合你。
在子查询中获取url
s 的count
,然后将join
与url
上的表一起获取:
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子句中的列?
only_full_group_by : "ORDER BY 子句不在 GROUP BY 子句中"
ORDER BY 子句的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列