Вы можете просто использовать 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
и выполнить в одном задании, но по существу переписать все таблица.