Это наилучшее возможное решение для ORACLE:
Select * from (select customerid, city, freight,
row_number() over (partition by customerid order by freight desc) Row_Number from
(select orders.orderId, customers.CUSTOMERID, customers.city, orders.FREIGHT from orders inner join customers on orders.customerid = customers.customerid where customers.country='Germany' order by customers.customerid, orders.freight desc)
order by customerid, freight desc) where Row_Number<=2;
Обратите внимание, здесь я использовал разделение по выражению для маркировки номера строки, главным образом потому, что нам нужно разделить записи, группируя их по идентификатору клиента,Я использовал два внутренних запроса здесь.Самый внутренний запрос состоит в том, чтобы дать представление, которое сортируется в соответствии с идентификатором клиента и уменьшением порядка стоимости.Теперь мы должны всегда получать две верхние записи, поэтому сначала нам нужно назвать их, а затем отфильтровать по rownum.Запрос второго уровня - пометить rownum в соответствии с идентификатором клиента.И последний запрос отфильтрует результат в соответствии с rownum.Для каждого раздела.