Search code examples
sqlsql-serverdatabase-partitioning

SELECT TOP record for each year


I am trying to recap on my sql skill, now I am trying to run a simple query on northwinddb to show me the top customer for each year, but as soon as I use the TOP function only 1 record gets display no matter on what I partition by, This is my T-SQL code

SELECT DISTINCT TOP 1 C.CompanyName
, YEAR(O.OrderDate) AS Year
, SUM(Quantity) OVER(PARTITION BY C.CompanyName, YEAR(O.OrderDate)) AS Total
FROM Customers C JOIN Orders O
    ON C.CustomerID = O.CustomerID JOIN [Order Details] OD
    ON O.OrderID = OD.OrderID

Solution

  • You can do this bit more compactly in SQL Server 2008 as follows:

    select top (1) with ties
      C.CompanyName,
      Year(O.OrderDate) as Yr,
      sum(OD.Quantity) as Total
    from Orders as O
    join Customers as C on C.CustomerID = O.CustomerID
    join "Order Details" as OD on OD.OrderID = O.OrderID
    group by C.CompanyName, Year(O.OrderDate)
    order by 
      row_number() over (
        partition by Year(O.OrderDate)
        order by sum(OD.Quantity) desc
      );