Подстановочные знаки в подзапросах

#google-bigquery

#google-bigquery

Вопрос:

Я пытаюсь протестировать некоторую логику, используя фиктивную таблицу и данные в BigQuery. Я успешно делал это с помощью

 WITH dummy AS (SELECT 1 AS a)
SELECT a FROM dummy
  

И, используя более сложный оператор WITH, я могу попробовать другую логику в этой фиктивной таблице.

Теперь я упираюсь в стену, поскольку у меня есть некоторые данные в разных разделах, которые я хочу протестировать. Используя стандартный SQL, я могу сделать что-то вроде:

 SELECT a
FROM
    `dummy_*`
WHERE
    _TABLE_SUFFIX BETWEEN '20161001' AND '20161003'
  

Однако мне бы очень хотелось иметь возможность сделать то же самое для подзапросов в предложении WITH:

 WITH 
    dummy_20161001 AS (SELECT 1 AS a UNION ALL SELECT 4 AS a),
    dummy_20161002 AS (SELECT 7 AS a UNION ALL SELECT 10 AS a)
SELECT a FROM dummy_*
WHERE
    _TABLE_SUFFIX BETWEEN '20161001' AND '20161003'
  

Есть ли что-нибудь, чем я могу заменить _TABLE_SUFFIX для этого, или есть какой-либо другой способ создать это фиктивное представление разделов таблицы?

Ответ №1:

Мне кажется, что приведенное ниже может удовлетворить ваши потребности в тестировании. По крайней мере, это вариант: o)

 WITH 
  dummy_20161001 AS (SELECT 1 AS a UNION ALL SELECT 2 AS a),
  dummy_20161002 AS (SELECT 3 AS a UNION ALL SELECT 4 AS a),
  dummy_20161003 AS (SELECT 5 AS a UNION ALL SELECT 6 AS a),
  dummy_20161004 AS (SELECT 7 AS a UNION ALL SELECT 8 AS a),
  `dummy_*` as (
    SELECT *, '20161001' as _TABLE_SUFFIX FROM dummy_20161001 UNION ALL
    SELECT *, '20161002' as _TABLE_SUFFIX FROM dummy_20161002 UNION ALL
    SELECT *, '20161003' as _TABLE_SUFFIX FROM dummy_20161003 UNION ALL
    SELECT *, '20161004' as _TABLE_SUFFIX FROM dummy_20161004
  )
SELECT a 
FROM `dummy_*`
WHERE
    _TABLE_SUFFIX BETWEEN '20161001' AND '20161003'
  

Комментарии:

1. Это выглядит хорошо 🙂 Я запустил это, и это сработало. Можете ли вы просто уточнить, dummy_* таблица не создается в BQ, поэтому мне не нужно удалять после?

Ответ №2:

_TABLE_SUFFIX Псевдоколонок и (если вы используете секционированные таблицы — _PARTITIONTIME ) работают только с таблицами, управляемыми BigQuery.

Возможно ли записать ваши образцы данных в несколько таблиц или в одну разделенную таблицу (используя SELECT query с destination_table)? После этого вы сможете использовать псевдоколонки.