Postgres имеет очень удобную функцию first_value()
, которая делает то, что вы хотите.,,почти.Единственное неудобство в том, что это оконная функция, а не аналитическая функция.Это можно решить с помощью select distinct
:
select distinct id,
first_value(n1) over (partition by id order by h desc) as n1_at_max_h,
first_value(n2) over (partition by id order by l desc) as n2_at_max_l
from t;
Это, вероятно, самый простой способ решения этой проблемы.
Если вы предпочитаете агрегирование, вы можете использовать:
select id,
( array_agg(n1 order by h desc) )[1] as n1_at_max_h,
( array_agg(n2 order by l desc) )[1] as n2_at_max_l
from t
group by id;