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 шт):
Можно попробовать вариант с подзапросом в 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 рекурсивным запросом.