7

这是我的 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 分组的数据

4

1 回答 1

7

您需要对查询中的所有非聚合值进行 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”这个词出现在所有事物中,所以它可能不像“swagger”这样的不太常见的词那么有趣。(这是莎士比亚发明的许多词之一)。

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 查询语言参考和BigQuery Cookbook了解更多示例。

于 2012-11-25T20:57:44.413 回答