Диапазон дат секционирования в секционированных таблицах - PullRequest
0 голосов
/ 24 марта 2020

Можно ли выбрать диапазон дат раздела на основе какой-либо другой даты в той же таблице GBQ?

_partitiondate имеет метку времени типа данных

покупка_дата имеет строку типа данных

Вот то, что я пытаюсь сделать -

_PARTITIONDATE < DATE(CAST(purchase_date as TIMESTAMP))
and _PARTITIONDATE >= date_add(date(CAST(purchase_date as TIMESTAMP)), interval -30 day)

Я получаю следующую ошибку -

Cannot query over table 'project.dataset.table' without a filter over column(s) '_PARTITION_LOAD_TIME', '_PARTITIONDATE', '_PARTITIONTIME' that can be used for partition elimination

1 Ответ

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

Документально подтверждено, что это возможно (см. Запрос разделов с использованием псевдоколумов для более подробной информации), ниже приведена структура, рекомендованная в документации:

_PARTITIONDATE >= "2018-01-29" AND _PARTITIONDATE < "2018-01-30"

или

_PARTITIONDATE BETWEEN '2016-01-01' AND '2016-01-02'

Дело в том, что, как вы правильно предположили, значение сравнения должно быть типом данных TIMESTAMP, поэтому может использоваться другой подход:

_PARTITIONDATE < TIMESTAMP(purchase_date)
and _PARTITIONDATE >= TIMESTAMP_ADD(TIMESTAMP(purchase_date), interval -30 day)

Я думаю, что-то вроде следующего должно работать :

SELECT
  columns
FROM
  dataset.table
WHERE
  _PARTITIONDATE BETWEEN TIMESTAMP_SUB(TIMESTAMP(purchase_date), interval 30 day)
  AND TIMESTAMP(purchase_date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...