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 ties
与 rank
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;
我有一个查询,我可以在哪里找到所有产品、购买每种产品的所有客户以及数量。
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 ties
与 rank
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;