postgresql выбрать первый элемент каждой группы

запрос: select field1, field2, field3, time from table_name результат запроса:

field1 field2 field3 time
id1 some data some data 1640203516
id2 some data some data 1640207116
id1 some data some data 1640117116

Необходимо результатом запроса получить только 1 экземпляр каждой сущности (один раз запись с id1, один раз запись с id2 и т.д. Выбирать запись необходимо с самым поздним временем). Использовать distinct я не могу (в контесте решаемой задачи это не возможно). Есть идея использовать group by по field1, но тогда мне его нужно в агрегатную функцию вставить и потом каким-то образом получить 1 элемент из каждой группы (с самым поздним временем). Как это возможно сделать? postgresql


Ответы (2 шт):

Автор решения: Anatoly

Можно попробовать вариант с подзапросом в WHERE, например, так:

select field1, field2,field3,field4, time from table t1
where time=(select max(t2.time) from table t2 where t2.field1=t.field1)
→ Ссылка
Автор решения: Мелкий

Если говорить о простом случае, то distinct on будет более чем достаточно:

select distinct on(field1) field1, time from tablename order by field1, time desc;

В случаях, где distinct on получается медленным и при том с небольшим числом различных field1 - делается loose index scan рекурсивным запросом.

→ Ссылка