Это то, что вы хотите?
select user, max(price) / min(price) - 1
from t
group by user;
Ваши значения монотонно растут, поэтому max()
и min()
кажутся простейшим решением.
EDIT:
Вы можете использовать оконные функции:
select user, max(last_price) / max(first_price) - 1
from (select t.*,
first_value(price) over (partition by user order by date rows between unbounded preceding and current_row) as first_price,
first_value(price) over (partition by user order by date desc rows between unbounded preceding and current_row) as last_price
from t
) t
group by user;