2014-09-15 3 views
0

У меня есть эти таблицы, Заказы Таблица:Максимальное значение счетчика в оракула

Name  Null? Type 
ORDER_ID NOT NULL NUMBER(5) 
CUSTOMER_ID   NUMBER(8) 
SHIPMENT_METHOD_ID NUMBER(2) 

и Shipment_method Таблица:

Name    Null?  Type 
SHIPMENT_METHOD_ID NOT NULL NUMBER(2) 
SHIPMENT_DESCRIPTION   VARCHAR2(80) 

Я пытаюсь получить наиболее используемый способ доставки на основе заказов , и я здесь как новичок, поэтому мне нужна помощь. Я думаю, что если у вас возможно MAX (count (order_id)), но как я могу это сделать для каждого параметра shipment_method_id?

ответ

2

Это еще один подход:

select shipment_method_id, shipment_description, count(*) as num_orders 
    from orders 
    join shipment_method 
using (shipment_method_id) 
group by shipment_method_id, shipment_description 
having count(*) = (select max(count(order_id)) 
        from orders 
        group by shipment_method_id) 
+0

Оценил, работал как шарм и легко получить – WaelT

2

Вам не нужно MAX, вам просто нужно вернуться в верхней строке

SELECT Shipment_Method_Desc 
FROM (
    SELECT Shipment_Method_ID, Shipment_Method_Desc, COUNT(*) AS ct 
    FROM Shipment_Method s 
    JOIN Orders o ON s.Shipment_Method_ID = o.Shipment_Method_ID 
    GROUP BY Shipment_Method_ID 
    ORDER BY ct DESC) 
WHERE ROWNUM = 1 

Если вы используете Oracle 12c или более поздней версии, вы можете использовать row limiting clause вместо подзапроса:

SELECT Shipment_Method_ID, Shipment_Method_Desc, COUNT(*) AS ct 
FROM Shipment_Method s 
JOIN Orders o ON s.Shipment_Method_ID = o.Shipment_Method_ID 
GROUP BY Shipment_Method_ID 
ORDER BY ct DESC 
FETCH FIRST 1 ROW ONLY 
1

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

SELECT shipment_method_id 
     ,shipment_description 
     ,orders 
FROM 
    (SELECT shipment_method_id 
      ,shipment_description 
      ,orders 
      ,rank() OVER (ORDER BY orders DESC) orders_rank 
    FROM 
     (SELECT smm.shipment_method_id 
       ,smm.shipment_description 
       ,count(*) orders 
     FROM orders odr 
      INNER JOIN shipment_method smm 
       ON (smm.shipment_method_id = odr.shipment_method_id) 
     GROUP BY smm.shipment_method_id 
       ,smm.shipment_description 
     ) 
    ) 
WHERE orders_rank = 1 
+0

Спасибо так много, но почему сделать так много избранных? – WaelT

+0

Это использует встроенные представления, чтобы быть более эффективными, внутренний выбор получает количество заказов по методу отправки, так как это оценивает их по счету, а затем выбирает записи (ы) с верхним рангом. Ответ Barmar не обслуживает несколько методов доставки с одинаковым количеством заказов. Ответ Брайана Демилии потребует двух полных сканирований таблиц в Orders (один в основном запросе и один для получения максимального значения в предложении HAVING), поэтому выполнение может занять больше времени. Могу отвечать на аналитические функции пользователей, чтобы избежать двойного сканирования Заказов. – DrabJay

0

Как новичок, вы можете найти с помощью with полезной, что позволяет иметь вид названных промежуточных результатов:

with STATS as (select SHIPMENT_METHOD_ID, count(*) as N 
       from ORDERS group by SHIPMENT_METHOD_ID) 
, MAXIMUM as (select max(N) as N from STATS) 
select SHIPMENT_METHOD_ID, SHIPMENT_DESCRIPTION 
from STATS 
join MAXIMUM on STATS.N = MAXIMUM.N 
natural join SHIPMENT_METHOD 
+0

Благодарим за предложение – WaelT

Смежные вопросы