I have 2 tables in Big Query:
TABLE A
| ID | Name | Date_A | field_x | field_y | field_z |
|---|---|---|---|---|---|
| xxx | tata | 10/11/2021 | a | 0 | 1 |
| xxx | tata | 11/11/2021 | a | 1 | 1 |
| zzz | tutu | 01/11/2021 | b | 0 | 1 |
| zzz | tutu | 05/11/2021 | b | 1 | 1 |
| yyy | titi | 02/11/2021 | c | 0 | 1 |
| uuu | tata | 08/11/2021 | d | 0 | 0 |
TABLE B
| ID | Name | Date_B | field_A | field_B |
|---|---|---|---|---|
| xxx | tata | 13/11/2021 | AA | BB |
| zzz | tutu | 01/11/2021 | CC | DD |
| yyy | titi | 11/11/2021 | AA | BB |
| uuu | tata | 05/11/2021 | DD | DD |
And I would like to link (left join on ID and Name) rows from table B to the max date of table A, to get :
| ID | Name | Date_A | field_x | field_y | field_z | field_A | field_B |
|---|---|---|---|---|---|---|---|
| xxx | tata | 10/11/2021 | a | 0 | 1 | NULL | NULL |
| xxx | tata | 11/11/2021 | a | 1 | 1 | AA | BB |
| zzz | tutu | 01/11/2021 | b | 0 | 1 | NULL | NULL |
| zzz | tutu | 05/11/2021 | b | 1 | 1 | CC | DD |
| yyy | titi | 02/11/2021 | c | 0 | 1 | AA | BB |
| uuu | tata | 08/11/2021 | d | 0 | 0 | DD | DD |
How can I do that in SQL (Big Query) please ? Thanks
CodePudding user response:
I didn't tested it but I think you should left join the b table to a table in which the max date is indicated. Usage of condition pure on the left table is somewhat unusual though from the definition of left join I expect it to work.
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
CodePudding user response:
Consider below approach
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)
if applied to sample data in your question - output is

