Вы можете использовать group by
, чтобы рассчитать общий доход, собрать все валюты в массиве и выбрать одну из самых высоких значений:
select id,
sum(rev_$),
product,
(array_agg(local_currency order by rev_$ desc))[1] as local_currency
from orders
group by id, product
order by id, product;
array_agg(local_currency order by rev_$ desc)
создаст массив для всех валют, которыеявляются частью группы, определенной group by
, упорядоченной по убыванию rev$
.Таким образом, первый элемент ([1]
) - это элемент, соответствующий «транзакции с наибольшим значением»
Онлайн-пример: https://rextester.com/VOK41538
Другой вариант - написать агрегатная функция , которая делает это без массива:
create or replace function first_agg (p_one anyelement, p_other anyelement )
returns anyelement
language sql
immutable strict
as
$$
select p_one;
$$;
create aggregate first_element
(
sfunc = first_agg,
basetype = anyelement,
stype = anyelement
);
Тогда вы можете использовать это так:
select id,
sum(rev_$),
product,
first_element(local_currency order by rev_$ desc) as local_currency
from orders
group by id, product
order by id, product;
Онлайн пример: https://rextester.com/YGRR9338