Оконная функция - лучшее решение для вас.
select id
from (
select team, id, rank() over (partition by team order by date desc) as row_num
from table
) t
where row_num = 1
Этот запрос вернет эту таблицу:
| id |
|----|
| 1 |
| 2 |
| 4 |
Если вы хотите получить по одной строке на команду, вам нужно использовать функцию array_agg
.
select team, array_agg(id) ids
from (
select team, id, rank() over (partition by team order by date desc) as row_num
from table
) t
where row_num = 1
group by team
Этот запрос вернет эту таблицу:
| team | ids |
|------|--------|
| A | [1, 2] |
| B | [4] |