У меня есть набор записей:
lvl | root_id | id
1 | 3000 | 5000
2 | 3000 | 5100
2 | 3000 | 5110
3 | 3000 | 5200
Мне нужно сгруппировать данные по полям root_id и получить значение id для каждого root_id с максимальным значением lvl:
root_id | id
3000 | 5200
Что-то типа:
SELECT root_id, last_value(id) over (partition by root_id order by last lvl)
FROM t
GROUP BY root_id;
Но я получаю сообщение об ошибке:
Column t.id must appear in the GROUPO BY clause or be used in an aggregate function.
Как я могу это исправить?


Вы можете использовать DISTINCT ON:
SELECT DISTINCT ON (root_id) root_id, id
FROM t
ORDER BY root_id, lvl DESC, id DESC
Вы можете попробовать использовать оконную функцию ROW_NUMBER.
Запрос 1:
SELECT root_id , id
FROM (
SELECT *, ROW_NUMBER() OVER(partition by root_id order by lvl desc) rn
FROM t
) t1
WHERE rn = 1
| root_id | id |
|---------|------|
| 3000 | 5200 |