# #sql #google-bigquery
#sql #google-bigquery
Вопрос:
У меня есть 2 таблицы в большом запросе:
ТАБЛИЦА А
ID | Имя | Дата _а | поле_x | field_y | поле_z |
---|---|---|---|---|---|
ХХХ | тата | 10/11/2021 | a | 0 | 1 |
ХХХ | тата | 11/11/2021 | a | 1 | 1 |
zzz | пачка | 01/11/2021 | b | 0 | 1 |
zzz | пачка | 05/11/2021 | b | 1 | 1 |
ууу | тити | 02/11/2021 | c | 0 | 1 |
ууу | тата | 08/11/2021 | d | 0 | 0 |
ТАБЛИЦА В
ID | Имя | Дата_В | поле_а | поле_b |
---|---|---|---|---|
ХХХ | тата | 13/11/2021 | aa | бб |
zzz | пачка | 01/11/2021 | куб.см | дд |
ууу | тити | 11/11/2021 | aa | бб |
ууу | тата | 05/11/2021 | дд | дд |
И я хотел бы связать (левое соединение по идентификатору и имени) строки из таблицы B с максимальной датой таблицы A, чтобы получить :
ID | Имя | Дата _а | поле_x | field_y | поле_z | поле_а | поле_b |
---|---|---|---|---|---|---|---|
ХХХ | тата | 10/11/2021 | a | 0 | 1 | нулевой | нулевой |
ХХХ | тата | 11/11/2021 | a | 1 | 1 | aa | бб |
zzz | пачка | 01/11/2021 | b | 0 | 1 | нулевой | нулевой |
zzz | пачка | 05/11/2021 | b | 1 | 1 | куб.см | дд |
ууу | тити | 02/11/2021 | c | 0 | 1 | aa | бб |
ууу | тата | 08/11/2021 | d | 0 | 0 | дд | дд |
Как я могу сделать это в SQL (Большой запрос), пожалуйста ? Спасибо
Комментарии:
1. Если вы используете Большой запрос (в соответствии с содержанием вашего вопроса), зачем помечать спам 3 другими СУБД..? Не помечайте спам, это не поможет другим помочь вам.
Ответ №1:
Рассмотрим следующий подход
select a.*, (if(row_number() over win = 1, b, null)).* except(id, name, date_b) from table_a a left join table_b b using(id, name) window win as (partition by a.id, a.name order by date_a desc)
если применить к образцам данных в вашем вопросе — вывод будет
Ответ №2:
Я не проверял это, но я думаю, что вам следует присоединиться к b
a
таблице, в которой указана максимальная дата. Использование условия чисто в левой таблице несколько необычно, хотя, исходя из определения левого соединения, я ожидаю, что оно сработает.
select a_ranked.ID, a_ranked.Name, a_ranked.Date_A , a_ranked.field_x, a_ranked.field_y, a_ranked.field_z , b.field_A, b.field_B from ( select a.*, rank() over (partition by ID, Name order by Date_A desc) as r from a ) a_ranked left join b on a_ranked.ID = b.ID and a_ranked.Name = b.Name and a_ranked.r = 1
Комментарии:
1. Это работает, но вам нужно исправить исходный выбор, чтобы быть
a_ranked
, а неa
т. е.a_ranked.ID, a_ranked.Name, a_ranked.Date_A, a_ranked.field_x, a_ranked.field_y, a_ranked.field_z
2. @Cleanbeans о, ужасная опечатка, спасибо, исправлено