在谷歌Bigquery做一组

时间:2012-11-24 22:24:58

标签: google-bigquery

这是我的BigQuery

SELECT word,word_count,corpus_date FROM 
[publicdata:samples.shakespeare] 
WHERE word="the" ORDER BY word_count asc

,输出为

    Row word    word_count corpus_date   
    1   the       57       1609  
    2   the       106      0     
    3   the       287      1609  
    4   the       353      1594  
    5   the       363      0     
    6   the       399      1592  
    7   the       421      1611  

我希望数据按corpus_date分组。我尝试使用corpus_date分组

    SELECT word,word_count,corpus_date FROM 
   [publicdata:samples.shakespeare] 
    WHERE word="the" group by corpus_date 
    ORDER BY word_count asc

但它确实不允许我通过corpus_date进行分组。任何方式获取按corpus_date分组的数据

1 个答案:

答案 0 :(得分:7)

您需要在查询中对GROUP BY中的所有非聚合值进行GROUP BY。但是,由于您只是在寻找单个单词,因此您不需要在结果集中显示甚至GROUP BY该单词(使用word =“the”子句隐式选择它。)

因此,如果您想要按日期分组的单词“the”的字数总和,您可以运行以下内容:

SELECT
  SUM(word_count) as sum_for_the,
  corpus_date
FROM
  [publicdata:samples.shakespeare]
WHERE
  word="the"
GROUP BY
  corpus_date
ORDER BY
  sum_for_the ASC;

这对自己来说并不是非常有用......所以如果你想做更多涉及的事情,比如学习每个日期的计数来自哪个语料库,请记下单词的计数并使用像这样的查询列出语料库:

SELECT
  SUM(word_count) AS sum_for_the, corpus, corpus_date
FROM
  [publicdata:samples.shakespeare]
WHERE
  word="the"
GROUP BY
  corpus_date, corpus
ORDER BY
  sum_for_the ASC;

为了列出每年出现一个单词的所有卷,我喜欢使用GROUP_CONCAT函数。 “the”这个词出现在所有的东西中,所以它可能不像一个不常见的词那样有趣,比如“招摇”。 (这是many words invented by Shakespeare之一)。

SELECT
  SUM(word_count) AS word_sum, GROUP_CONCAT(corpus) as corpora, corpus_date
FROM
  [publicdata:samples.shakespeare]
WHERE
  word="swagger"
GROUP BY
  corpus_date ORDER BY corpus_date ASC;

更有趣的是查看每个卷和日期的单词前缀和单词的GROUP BY变体:

SELECT
  word, SUM(word_count) AS word_sum, GROUP_CONCAT(corpus) as corpora, corpus_date
FROM
  [publicdata:samples.shakespeare]
WHERE
  word CONTAINS "swagger"
GROUP BY
  word, corpus_date
ORDER BY
  corpus_date ASC
IGNORE CASE;

查看BigQuery Query Language引用和BigQuery Cookbook以获取更多示例。