max (count (*)) для нескольких результатов - PullRequest
0 голосов
/ 25 января 2020

У меня есть две таблицы:

Clients(client_id(pk),client_name,phone,email)
orders(order_number(pk),date,client_id,method)

Я хочу выбрать только данные клиентов с наибольшим количеством заказов (например: если наибольшее количество заказов составляет 6 и есть 3 клиента с таким числом из заказов я хочу, чтобы все 3 из них были показаны). Моя проблема в том, что я могу отобразить только данные одного клиента и хочу просмотреть все детали максимальных значений.

Это то, что я пробовал до сих пор:

SELECT MAX(NUMBER_OF_ORDERS)
FROM (
    SELECT C.CLIENT_NAME,
           COUNT(O.CLIENT_ID) NUMBER_OF_ORDERS
    FROM CLIENTS C,
         ORDERS O
    WHERE C.ID_CLIENT = O.ID_CLIENT
    GROUP BY C.NUME_CLIENT
    );

1 Ответ

1 голос
/ 25 января 2020

Я хочу выбрать только данные клиентов с наибольшим количеством заказов

Начиная с Oracle 12, это легко с предложением ограничения строки:

SELECT C.CLIENT_NAME, COUNT(O.CLIENT_ID) NUMBER_OF_ORDERS
FROM CLIENTS C
INNER JOIN ORDERS O ON C.ID_CLIENT = O.ID_CLIENT
GROUP BY C.NUME_CLIENT, C.CLIENT_NAME
ORDER BY NUMBER_OF_ORDERS DESC
FETCH FIRST 1 ROW WITH TIES

В более ранних версиях одним из вариантов является использование оконных функций:

SELECT CLIENT_NAME, NUMBER_OF_ORDERS
FROM (
    SELECT 
        C.CLIENT_NAME, 
        COUNT(O.CLIENT_ID) NUMBER_OF_ORDERS, 
        RANK() OVER(ORDER BY COUNT(O.CLIENT_ID) DESC) RN
    FROM CLIENTS C
    INNER JOIN ORDERS O ON C.ID_CLIENT = O.ID_CLIENT
    GROUP BY C.NUME_CLIENT, C.CLIENT_NAME
) T
WHERE RN = 1 

Важные примечания:

  • всегда использовать явное, Стандартные объединения (с ключевым словом ON), а не неявные неявные объединения (с запятой в предложении FROM), синтаксис которых десятилетиями не использовался

  • все неагрегированные столбцы, которые появляются в предложении SELECT, должны быть перечислены в предложении GROUP BY; Ваш исходный запрос отсутствует C.CLIENT_NAME в предложении GROUP BY. В Oracle и большинстве других баз данных это синтаксическая ошибка

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