首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在BigQuery SQL语法中,如何正确地“作为”应用了"LOWER“函数的列,以便在包装"SELECT”中引用它?

在BigQuery SQL语法中,如何正确地“作为”应用了"LOWER“函数的列,以便在包装"SELECT”中引用它?
EN

Stack Overflow用户
提问于 2019-06-13 03:24:05
回答 1查看 109关注 0票数 0

我想在“莎士比亚”( samples -> BigQuery,又称bigquery-public-data.samples.shakespeare)上的可公开访问的莎士比亚数据库中找到给定单词的总字数。

模式如下所示:

代码语言:javascript
复制
Field name | Type     | Mode      |  Description
---------------------------------------------------
word       | STRING   | REQUIRED  | A single unique word (where whitespace is the delimiter) extracted from a corpus.
word_count | INTEGER  | REQUIRED  | The number of times this word appears in this corpus.
corpus     | STRING   | REQUIRED  | The work from which this word was extracted.
corpus_date| INTEGER  | REQUIRED  | The year in which this corpus was published.

我已经成功地组合了corpus所有值中的所有小写单词,然后将所有corpus实例组合到一个新列found_in中,同时还将它们的单词计数合并到列total_word_count中。

我的查询如下所示:

代码语言:javascript
复制
SELECT
  STRING_AGG(DISTINCT corpus) AS found_in,
  LOWER(word),
  SUM(word_count) AS total_word_count
FROM
  `bigquery-public-data.samples.shakespeare`
GROUP BY
  LOWER(word)
ORDER BY
  total_word_count DESC
LIMIT
  1000

输出列为

代码语言:javascript
复制
Row     found_in    f0_     total_word_count 

我的问题是重命名f0_列。这是一个问题,因为我希望将整个内容包装在另一个查询中,这样我就可以执行类似SELECT * FROM {{that previous query}} WHERE word="thou"的操作。

我不明白的是

  1. 如何在我的WHERE子句中引用"word“。
  2. 如何命名主查询的LOWER(word)部分,就像我对STRING_AGG和(LOWER(word))所做的那样(使用AS)。

我尝试了以下几种方法:

代码语言:javascript
复制
SELECT
* 
FROM
(
SELECT
  STRING_AGG(DISTINCT corpus) AS found_in,
  LOWER(word),
  SUM(word_count) AS total_word_count
FROM
  `bigquery-public-data.samples.shakespeare`
GROUP BY
  LOWER(word)
ORDER BY
  total_word_count DESC
LIMIT
  1000
)
WHERE word = 'thou'

然而,我在最后一行得到了一个错误:Unrecognized name: word

因此,我尝试使用AS

代码语言:javascript
复制
SELECT
* 
FROM
(
SELECT
  STRING_AGG(DISTINCT corpus) AS found_in,
  LOWER(word) AS lowered_word,
  SUM(word_count) AS total_word_count
FROM
  `bigquery-public-data.samples.shakespeare`
GROUP BY
  LOWER(word)
ORDER BY
  total_word_count DESC
LIMIT
  1000
)
WHERE word = 'and'

但是在使用LOWER(word)时,我得到了错误SELECT list expression references column word which is neither grouped nor aggregated

这让我感到困惑,因为我看到GROUP BY引用了word

如何才能正确地引用较低的(单词),以便在第二题中引用它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-13 03:40:46

我想这就是你想要的:

代码语言:javascript
复制
SELECT * 
FROM (SELECT STRING_AGG(DISTINCT corpus) AS found_in,
             LOWER(word) AS lowered_word,
             SUM(word_count) AS total_word_count
      FROM `bigquery-public-data.samples.shakespeare`
      GROUP BY lowered_word
      ORDER BY total_word_count DESC
      LIMIT 1000
     ) w
WHERE lowered_word = 'and';

备注:

  • 子查询没有生成称为word的东西,因此使用外部lowered_word可以在BigQuery中按列别名进行聚合。
  • 子查询中的LIMIT似乎是任意的。我不认为这会提高性能或降低查询成本。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56569097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档