получить строку с максимумом из группы по результатам - PullRequest
0 голосов
/ 02 октября 2011

У меня есть sql, например:

select 
  c.customerID, sum(o.orderCost) 
from customer c, order o 
where c.customerID=o.customerID 
group by c.customerID;

Возвращает список

customerID, orderCost

, где orderCost - общая стоимость всех заказов, сделанных клиентом.Я хочу выбрать клиента, который заплатил нам больше всего (у которого самая высокая стоимость заказа).Нужно ли создавать для этого вложенный запрос?

Ответы [ 2 ]

1 голос
/ 03 октября 2011

Вам нужен вложенный запрос, но вам не нужно дважды обращаться к таблицам, если вы используете аналитические функции .

select customerID, sumOrderCost from
(
    select customerID, sumOrderCost,
        rank() over (order by sumOrderCost desc) as rn
    from (
        select c.customerID, sum(o.orderCost) as sumOrderCost
        from customer c, orders o
        where c.customerID=o.customerID
        group by c.customerID
    )
)
where rn = 1;

Функция rank() ранжирует результаты вашего исходного запроса по значению sum(), затем вы выбираете только те, которые имеют наивысший ранг, то есть строки с наибольшей общей стоимостью заказа.

Если более одного клиента имеют одинаковую общую стоимость заказа, это вернет оба. Если это не то, что вам нужно, вам придется решить, как определить, какой из результатов использовать. Например, если вам нужен самый низкий идентификатор клиента, добавьте его в функцию ранжирования:

select customerID, sumOrderCost,
    rank() over (order by sumOrderCost desc, customerID) as rn

Вы можете настроить исходный запрос так, чтобы вместо него возвращались другие данные, только для упорядочения, и не включать их во внешний select.

0 голосов
/ 02 октября 2011

Для этого вам нужно создать вложенный запрос.Два запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...