SQL 和罗斯文

SQL And Northwind

我有一个查询,我可以在哪里找到所有产品、购买每种产品的所有客户以及数量。

select OD.ProductID, OD.Quantity, O.CustomerID
from dbo.[Order Details] OD inner join dbo.Orders O on OD.OrderID = O.OrderID
Order by OD.ProductID ASC, OD.Quantity DESC

但我现在需要的是哪个客户购买了最多的每种产品。我该怎么做?

您可以将 top 1 with tiesrank window 函数一起使用:

select top 1 with ties OD.ProductID,
    OD.Quantity,
    O.CustomerID
from dbo.[Order Details] OD
inner join dbo.Orders O on OD.OrderID = O.OrderID
order by rank() over (
        partition by OD.ProductID order by OD.Quantity desc
        );

如果有多个客户为该产品订购了最大数量,以上将为每个产品 ID return 多行。

如果只想获取一行,可以使用row_number:

select top 1 with ties OD.ProductID,
    OD.Quantity,
    O.CustomerID
from dbo.[Order Details] OD
inner join dbo.Orders O on OD.OrderID = O.OrderID
order by row_number() over (
        partition by OD.ProductID order by OD.Quantity desc
        );

你也可以在没有 top 的情况下这样做:

select *
from (
    select OD.ProductID,
        OD.Quantity,
        O.CustomerID,
        row_number() over (
            partition by OD.ProductID order by OD.Quantity desc
            ) as rn
    from dbo.[Order Details] OD
    inner join dbo.Orders O on OD.OrderID = O.OrderID
    ) t
where rn = 1;