BigQuery: во временной таблице - PullRequest
0 голосов
/ 17 июня 2019

У меня длинный SQL-запрос, похожий на этот:

SELECT AVG(total_sum) AS avg_total_sum, COUNT(*) AS cnt
FROM (
  SELECT order_id, ...
  FROM `project.dataset.orders`
  WHERE order_id NOT IN (
    SELECT order_id
    FROM `project.dataset.orders`
    CROSS JOIN UNNEST(gifts) AS gifts
    WHERE ...
  )
)

И это хорошо работает, но я бы хотел упростить код, разбив его на временные таблицы, например:

WITH t_ids AS (
  SELECT order_id
  FROM `project.dataset.orders`
  CROSS JOIN UNNEST(gift_details) AS gift_details
  WHERE ...
)

SELECT AVG(total_sum) AS avg_total_sum, COUNT(*) AS cnt
FROM (
  SELECT order_id, ...
  FROM `project.dataset.orders`
  WHERE order_id NOT IN t_ids
)

Но это приводит к следующей ошибке:

Синтаксическая ошибка: ожидается "(" или ключевое слово UNNEST, но получен идентификатор "t_ids"

Я пытался добавить скобки, UNNEST, но, похоже, он не работает с временной таблицей. Как решить проблему?

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Я только что заметил, что могу просто заменить NOT IN t_ids на NOT IN (SELECT order_id FROM t_ids):

WITH t_ids AS (
  SELECT order_id
  FROM `project.dataset.orders`
  CROSS JOIN UNNEST(gift_details) AS gift_details
  WHERE ...
)

SELECT AVG(total_sum) AS avg_total_sum, COUNT(*) AS cnt
FROM (
  SELECT order_id, ...
  FROM `project.dataset.orders`
  WHERE order_id NOT IN (SELECT order_id FROM t_ids)
)

Наконец, код работает и выглядит хорошо! Но если у кого-то есть более короткое и чистое решение, я буду рад принять его.

0 голосов
/ 17 июня 2019

вы можете попробовать, как показано ниже

WITH t_ids AS (
    SELECT order_id
    FROM `project.dataset.orders`
    CROSS JOIN UNNEST(gifts) AS gifts
    WHERE ...+++
)
, cte as ( SELECT order_id, ...
          FROM `project.dataset.orders` t1
          join t_ids on t1.order_id=t_ids.order_id
) SELECT AVG(total_sum) AS avg_total_sum, COUNT(*) AS cnt from cte

ваш WHERE order_id NOT IN t_ids эта строка совершенно неверна, потому что вы не выбрали ни одного идентификатора, но использовали его в предложении where. Кстати, я изменил его, используя причину соединениявам нужен только общий идентификатор обеих таблиц, который выполняется внутренним соединением

...