Как правильно «КАК» столбец, к которому применена функция «НИЖЕ», чтобы ссылаться на него в обертке «ВЫБОР» в синтаксисе BigQuery SQL? - PullRequest
0 голосов
/ 12 июня 2019

Я хотел бы найти общее количество слов данного слова в общедоступной базе данных BigQuery по «Шекспир» (в разделе «Примеры -> Шекспир», также известный как bigquery-public-data.samples.shakespeare).

Схема выглядит следующим образом:

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, а также SUM подсчитал их слова в столбце total_word_count.

Мой запрос выглядит так:

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

Выходные столбцы:

Row     found_in    f0_     total_word_count 

Моя проблема переименовывает столбец f0_. Это проблема, потому что я хотел бы обернуть все это в другой запрос, чтобы я мог сделать что-то вроде SELECT * FROM {{that previous query}} WHERE word="thou".

Чего я не понимаю, так это

  1. Как ссылаться на слово в моем предложении WHERE.

  2. Как назвать часть LOWER(word) моего основного запроса, как я делал для STRING_AGG и (SUM) (используя AS).

Я попробовал следующее:

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:

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'

Но тогда я получил ошибку SELECT list expression references column word which is neither grouped nor aggregated, на линии с LOWER(word).

Это смущает меня, потому что я вижу word, на который ссылается GROUP BY.

Как правильно ссылаться на LOWER (слово), чтобы ссылаться на него во вторичном запросе?

1 Ответ

2 голосов
/ 12 июня 2019

Я думаю, что это то, что вы хотите:

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 в подзапросе кажется произвольным.Я не думаю, что это повышает производительность или снижает стоимость запроса.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...