选择每年的TOP记录

时间:2012-03-08 13:42:51

标签: sql sql-server database-partitioning

我试图回顾一下我的sql技巧,现在我试图在northwinddb上运行一个简单的查询,向我展示每年的顶级客户,但是一旦我使用TOP功能,只有1条记录显示无论如何在我分区的地方,这是我的T-SQL代码

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

3 个答案:

答案 0 :(得分:13)

您可以在SQL Server 2008中更紧凑地执行此操作,如下所示:

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
  );

答案 1 :(得分:1)

感谢您的帮助。我找到了一种方法,可以让我改变每年想要看到的顶级客户数量。通过使用Sub查询和Row_Number

SELECT CompanyName
,yr
,Total
FROM(SELECT CompanyName
, yr
, Total
, ROW_NUMBER() OVER(PARTITION BY yr ORDER BY yr, Total DESC) AS RowNumber
FROM(SELECT DISTINCT CompanyName
    , YEAR(O.OrderDate) AS yr
    ,  SUM(OD.Quantity) OVER(PARTITION BY 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) Tr)Tr2
Where RowNumber <= 1

答案 2 :(得分:0)

三个步骤:首先按公司和年份分组的总和数量,然后按数量排序结果,然后按组过滤第一行。

; WITH sums as (
   SELECT C.Companyname, YEAR(O.OrderDate) AS Year, sum (Quantity) Total
     FROM Customers C JOIN Orders O
    ON C.CustomerID = O.CustomerID JOIN [Order Details] OD
    ON O.OrderID = OD.OrderID
    group by C.Companyname, YEAR(O.OrderDate)
)
with ordering as (
   select Companyname, Year, Total,
          row_number() over (partition by CompanyName, Year order by Total desc) rownum
      from sums
)
select *
from ordering
where rownum = 1