Перезапись нескольких разделов bigquery - PullRequest
0 голосов
/ 16 февраля 2020

скажем, у меня есть таблица t1, дата которой разбита на столбец sdate

У меня есть другая таблица t2, которая также разбита на столбец pdate, в которой уже есть данные в некоторых разделах ( 20200101 - 20200130)

Теперь я хочу перезаписать несколько разделов (с 20200105 по 20200110) в t2 из данных в t1

, и я хочу сделать это в одном запросе и не один запрос на раздел.

Выберите запрос:

SELECT sdate,
c1, c2

FROM `dataset.t1` where sdate between "2020-01-05" and "2020-01-10"

Я видел примеры, где мы можем указать таблицу назначения, например t2$20200102, но это перезапишет только один раздел.

Как написать оператор вставки для заполнения выбранных разделов

Есть ли идеи о том, как будет выглядеть запрос вставки?

1 Ответ

1 голос
/ 16 февраля 2020

Вы можете просто использовать SELECT sdate AS pdate в своем выражении INSERT:

INSERT dataset.t2 (pdate, c1, c2) 
  SELECT sdate AS pdate, c1, c2
  FROM dataset.t1
  WHERE sdate BETWEEN "2020-01-05" and "2020-01-10"

Конечно, это добавит строки к каждому целевому разделу, поэтому, если вы хотите перезаписать их, вы можете удалить сначала с:

DELETE
  dataset.t2
WHERE
  pdate BETWEEN "2020-01-05" AND "2020-01-10"

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

DELETE
  dataset.t2
WHERE
  pdate IN (
    SELECT sdate 
    FROM dataset.t1 
    WHERE sdate BETWEEN "2020-01-05" AND "2020-01-10")

Вы также можете рассмотреть возможность использования MERGE, но тогда вам нужно будет принять учитывать то, что происходит при сопоставлении строка за строкой.

Я провел несколько тестов с этим gist .

Другой вариант - выполнить пошаговый SELECT запрос к разбить данные на три диапазона дат и UNION ALL, чтобы свести их вместе.

SELECT * FROM dataset.t2
WHERE pdate < "2020-01-05" OR pdate > "2020-01-10"
UNION ALL
SELECT * FROM dataset.t1
WHERE sdate BETWEEN "2020-01-05" AND "2020-01-10"

Для этого требуется указать таблицу назначения с помощью WRITE_TRUNCATE и выполнить в одном задании, но по существу переписать все таблица.

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