Найти строку с самым высоким значением в SQL - PullRequest
0 голосов
/ 08 ноября 2018

Согласно схеме, таблица Orders имеет следующие столбцы:

OrderId integer, CustomerId integer, RetailerId integer, ProductId integer, Count integer

Я пытаюсь выяснить, какой товар имеет наибольшее количество заказов для каждого продавца.

Итак, для суммирования всех заказов по продукту у меня следующий запрос:

SELECT RetailerId, ProductId, SUM(Count) AS ProductTotal
FROM Orders
GROUP BY RetailerId, ProductId
ORDER BY RetailerId, ProductTotal DESC;

Это дает такой вывод:

RETAILERID  PRODUCTID PRODUCTTOTAL
---------- ---------- ------------
         1          5          115
         1         10           45
         1          1           15
         1          4            2
         1          8            1
         2          9           12
         2         11           10
         2          7            1
         3          3            3
         4          2            1
         5         11            1

Теперь все, что я хочу сделать, - это найти продукт с наибольшим количеством заказов на одного продавца. Прямо сейчас это показывает все продукты; Я хочу только один.

Я перепробовал слишком много вещей. Ниже приведен один особенно отвратительный пример:

SELECT O.RetailerId, O.ProductId, O.ProductTotal
FROM (
  SELECT Orders.ProductId, MAX(ProductTotal) AS MaxProductTotal
  FROM (
    SELECT Orders.ProductId AS PID, SUM(Orders.Count) AS ProductTotal
    FROM Orders
    GROUP BY Orders.ProductId
  ) AS O INNER JOIN Orders ON Orders.ProductId = PID
  GROUP BY Orders.ProductId
) AS X INNER JOIN O ON O.RetailerId = X.RetailerId AND O.ProductTotal = X.MaxProductTotal;

Решение этой проблемы, наверное, самое простое, но я просто не могу сейчас. Итак, мне нужна помощь.

Ответы [ 5 ]

0 голосов
/ 08 ноября 2018

Выберите максимальную сумму на одного клиента с помощью оконной функции:

SELECT RetailerId, ProductId, ProductTotal
FROM
(
  SELECT
    RetailerId, ProductId, SUM(Count) AS ProductTotal,
    MAX(SUM(Count)) OVER (PARTITION BY RetailerId) AS MaxProductTotal
  FROM Orders
  GROUP BY RetailerId, ProductId
)
WHERE ProductTotal = MaxProductTotal
ORDER BY RetailerId;
0 голосов
/ 08 ноября 2018

Вот версия без подзапроса с использованием FIRST / LAST:

WITH t(RETAILERID, PRODUCTID, PRODUCTTOTAL) AS (    
    SELECT 1,  5,  115 FROM dual UNION ALL
    SELECT 1, 10,   45 FROM dual UNION ALL
    SELECT 1,  1,   15 FROM dual UNION ALL
    SELECT 1,  4,    2 FROM dual UNION ALL
    SELECT 1,  8,    1 FROM dual UNION ALL
    SELECT 2,  9,   12 FROM dual UNION ALL
    SELECT 2, 11,   10 FROM dual UNION ALL
    SELECT 2,  7,    1 FROM dual UNION ALL
    SELECT 3,  3,    3 FROM dual UNION ALL
    SELECT 4,  2,    1 FROM dual UNION ALL
    SELECT 5,11,    1 FROM dual)
SELECT 
   RETAILERID, 
   MAX(PRODUCTID) KEEP (DENSE_RANK LAST ORDER BY PRODUCTTOTAL) AS PRODUCTID, 
   MAX(PRODUCTTOTAL)
FROM t
GROUP BY RETAILERID;


+--------------------------------------+
|RETAILERID|PRODUCTID|MAX(PRODUCTTOTAL)|
+--------------------------------------+
|1         |5        |115              |
|2         |9        |12               |
|3         |3        |3                |
|4         |2        |1                |
|5         |11       |1                |
+--------------------------------------+
0 голосов
/ 08 ноября 2018

вы можете использовать row_number() с cte

with cte as
(
   SELECT o.RetailerId,o.ProductId AS PID, SUM(o.Count) AS ProductTotal
    FROM Orders o
    GROUP BY o.ProductId,o.RetailerId
), cte2 as
(
select RetailerId,PID,ProductTotal, 
row_number() over(partition by RetailerId order by ProductTotal desc) as rn
from cte
) select RetailerId,PID,ProductTotal from cte2 where rn=1
0 голосов
/ 08 ноября 2018

Вы пробовали использовать ранг?

Попробуйте этот запрос

select OrderC, retailer_id,product_id from ( select sum(count_order) as OrderC,retailer_id,product_id,row_number() over(order by OrderC desc) as RN from order_t  group  by retailer_id,product_id) as d where RN=1;
0 голосов
/ 08 ноября 2018

Вы можете попробовать использовать оконную функцию row_number()

select * from
(
select *,row_number() over(partition by RetailerId order by ProductTotal desc) as rn from
(
SELECT RetailerId, ProductId, SUM(Count) AS ProductTotal
FROM Orders
GROUP BY RetailerId, ProductId
)A
)X where rn=1
...