Как использовать подзапросы WITH в качестве списка параметров в предложении WHERE в стандарте SQL - PullRequest
1 голос
/ 10 марта 2020

В чем проблема

У меня очень большой список результатов. Я хочу отфильтровать свой запрос, чтобы включить только небольшой поднабор тех, которые основаны на самых популярных результатах в таблице.

Когда я помещаю свой подзапрос фильтрации в предложении WITH, он не работает. Но если я положу это прямо в предложении WHERE, это сработает. Почему?

Я бы предпочел первое для ясности, но не могу заставить его работать.

Я работаю в BigQuery со стандартным SQL.

Пример

WITH
  most_common AS (
  SELECT
    page
  FROM
    `mydataset`
  LIMIT 
    100
)
SELECT
  *
FROM
   `mydataset`
WHERE
  page IN most_common

Здесь я пытаюсь получить все результаты, где страница находится в первых 100 строках.

Возвращает следующую ошибку: - Syntax error: Expected "(" or keyword UNNEST but got identifier "most_common" at [12:12]

Однако, если я помещу подзапрос прямо туда, где он работает нормально.

SELECT
  *
FROM
   `mydataset`
WHERE
  page IN (
  SELECT
    page
  FROM
    `mydataset`
  LIMIT 
    100
)

Мое ограниченное понимание

Это говорит он хочет unnest, но unnest превращает массив в результат таблицы, так как подзапрос - это уже таблица.

Ответы [ 2 ]

1 голос
/ 10 марта 2020
#standardSQL
WITH
  most_common AS (
  SELECT
    page
  FROM
    `mydataset`
  LIMIT 
    100
)
SELECT
  *
FROM
   `mydataset`
WHERE
  page IN (SELECT page FROM most_common)  

Другая опция:

#standardSQL
WITH most_common AS (
  SELECT ARRAY_AGG(page) pages FROM (
    SELECT page
    FROM `mydataset`
    LIMIT 100
  )
)
SELECT *
FROM `mydataset`, most_common
WHERE page IN UNNEST(pages)   

или слегка измененная версия

#standardSQL
WITH most_common AS (
  SELECT ARRAY_AGG(page LIMIT 100) pages 
  FROM `mydataset`
)
SELECT *
FROM `mydataset`, most_common
WHERE page IN UNNEST(pages)  

Примечание: ARRAY_AGG(...) принимает предложение ORDER BY, так что вы можете выбрать наиболее распространенный, используя этот синтаксис ARRAY_AGG(page ORDER BY some metric DESC LIMIT 100)
Очевидно, окончательная версия зависит от вашего реального варианта использования - но, скорее, чем это - у вас есть идея, я надеюсь

0 голосов
/ 10 марта 2020

При написании запроса с выражением CTE данные будут возвращаться в табличном формате. Вы можете использовать выражение CTE в подзапросе для работы.

WITH MYSELECT AS (SELECT
  status
FROM
  `bigquery-public-data.austin_311.311_request`
LIMIT 100)
SELECT COUNT(*) FROM `bigquery-public-data.austin_311.311_request` WHERE status IN (SELECT DISTINCT status FROM MYSELECT);

Этот запрос будет работать. Надеюсь, это поможет!

Большое спасибо, Срига

...