Объявление большой переменной запроса с запланированным запросом и таблицей назначения - PullRequest
0 голосов
/ 28 октября 2019

Я использую запланированный запрос в Big Query, который добавляет данные за предыдущий день в таблицу Big Query. Данные за предыдущий день не всегда доступны, когда выполняется мой запрос, поэтому, чтобы убедиться, что у меня есть все данные, мне нужно рассчитать последнюю дату, доступную в моей таблице больших запросов.

Моей первой попыткой было написать следующий запрос:

SELECT *
FROM sourceTable
WHERE date >= (SELECT Max(date) from destinationTable)

Когда я выполняю этот запрос, правильно экспортируется только дата> = max (date). Однако запрос обрабатывает всю исходную таблицу, а не только J - max (дата). Таким образом, стоимость выше, чем ожидалось.

Я также пытался объявить переменную, используя "DECLARE" & "SET" (https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting).). Это решение работает нормально, и обрабатывается только J - max (дата). Однако BQ интерпретирует запрос с«ОБЪЯВЛЯЙТЕ» как скрипт, поэтому результаты не могут быть автоматически экспортированы в таблицу BQ с использованием запланированных запросов.

DECLARE maxDate date;
SET maxDate = (SELECT Max(date) from destinationTable); 
SELECT *
FROM sourceTable
WHERE date >= maxDate

Есть ли другой способ сделать то, что я хотел бы? Или способ объявитьпеременная, использующая "DECLARE" & "SET" в запланированном запросе с таблицей назначения?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Запрос сценариев, когда он запланирован, пока не поддерживает настройку таблицы назначения. Вам нужно использовать DDL / DML, чтобы внести изменения в существующую таблицу.

 DECLARE maxDate date;
SET maxDate = (SELECT Max(date) from destinationTable); 
CREATE OR REPLACE destinationTable AS
SELECT *
FROM sourceTable
WHERE date >= maxDate
0 голосов
/ 29 октября 2019

Является ли destinationTable разделенным? Если нет, можете ли вы воссоздать его как секционированную таблицу? Если это секционированная таблица и секционированная по столбцу destinationTable.date, вы можете сделать что-то вроде:

SELECT *
FROM sourceTable
WHERE date >= (SELECT MAX(_PARTITIONTIME) from destinationTable)

Поскольку _PARTITIONTIME является псевдостолбцом, запуск подзапроса бесплатен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...