Vous pouvez utiliser top 1 with ties
avec fonction rank
fenêtre:
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
);
ci-dessus renverra plusieurs lignes par productId s'il y a plusieurs clients avec la quantité maximale commandée pour ce produit.
Si vous voulez obtenir une seule ligne, vous pouvez utiliser 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
);
Vous pouvez aussi le faire sans 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;
Quelle version de SQL Server? Dans les versions ultérieures, vous pouvez utiliser RANK() pour résoudre ce problème. –
SQL Server 2014 –