#sql #join #google-bigquery #left-join
# #sql #Присоединиться #google-bigquery #левое соединение
Вопрос:
У меня есть две таблицы, как показано ниже:
ТАБЛИЦА_1:
timestamp id
2020-11-24 01:05:00 UTC AA
2020-11-24 01:07:00 UTC AA
2020-11-24 01:07:00 UTC BB
ТАБЛИЦА_2:
timestamp id covered
2020-11-24 01:04:00 UTC AA true
2020-11-24 01:06:00 UTC AA false
Я хочу добавить столбец в table_1, чтобы показать закрытое значение из table_2. Хотя временные метки не совпадают, я хочу получить ближайшую предыдущую временную метку, записанную в таблице_2.
Например, AA был закрыт в 1: 04 и раскрыт в 1: 06, поэтому таблица результатов выглядит следующим образом:
timestamp id covered
2020-11-24 01:05:00 UTC AA true
2020-11-24 01:07:00 UTC AA false
2020-11-24 01:07:00 UTC BB null
Не могли бы вы помочь мне завершить этот запрос:
SELECT TABLE_1.timestamp, TABLE_1.id, TABLE_2.covered
FROM TABLE_1
LEFT JOIN
TABLE_2
ON TABLE_1.id = TABLE_2.id
AND ?
Ответ №1:
BigQuery не в восторге от неравновесных соединений. Таким образом, альтернативой является использование union all
и некоторая хитрость:
select t12.*
from (select t12.*,
last_value(covered ignore nulls) over (partition by id order by timestamp) as imputed_covered
from ((select timestamp, id, null as covered
from table_1
) union all
(select timestamp, id, covered
from table_2
)
) t12
) t12
where covered is null;
Это объединение двух таблиц. Затем last_value()
извлекается самое последнее covered
значение, из которого table_1
будут получены строки table_2
.
Финал where
просто фильтрует результирующий набор, чтобы иметь только table_1
строки.