1

我有一个包含 Access 数据库中客户和产品信息的表:

custID product price
--------------------
1   objectA   12,5
1   objectB   54,51
1   objectC   14,85
2   objectE  188,84
2   objectC   14,85
2   objectD  188,84

从该表中,我想获得客户通过 SQL 购买的最昂贵的产品。我试过这个:

SELECT a.custID, a.product, max(a.price)
FROM orders AS a INNER JOIN orders AS b ON (a.custID=b.custID) AND (a.price<=b.price)
GROUP BY a.product, a.custID
HAVING count(*)<2;

结果是

1   objectB  54,51

它适用于最高价格仅出现一次但当两种产品具有相同(最高)价格时失败的所有情况。如何确保为每个客户获得结果?(我不关心客户 2 的 objectD 或 objectE 是否会这样做)。

4

1 回答 1

1
SELECT a.custID, MAX(a.product), MAX(a.price)
FROM orders AS a 
WHERE a.price = (select MAX(b.price) from orders b where a.custID=b.custID)
GROUP by a.custID

附注:
如果您有更高级的支持窗口功能的 SQL 服务器,例如 SQL Server 2008,您可以改为编写

SELECT custID, product, price FROM (
    SELECT custID, product, price,  ROW_NUMBER()
        OVER (partition by custid order by price desc) AS rowNo
    FROM orders 
) AS a
WHERE a.rowNo = 1
于 2012-04-13T10:40:42.333 回答