首页 > 解决方案 > 在 SQL 中查找具有最高值的行

问题描述

根据架构,该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;

解决这个问题可能是有史以来最简单的事情,但我现在不能。所以,我想要一些帮助。

标签: sqloraclegreatest-n-per-group

解决方案


使用窗口函数选择每个客户的最大总数:

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;

推荐阅读