Как сделать ЛЕВОЕ ПРИСОЕДИНЕНИЕ к строкам с максимальной датой в БК?

# #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 о, ужасная опечатка, спасибо, исправлено