如何获得子集的最高记录?

时间:2013-03-07 04:51:25

标签: sql sql-server-2008 tsql group-by

说我有一张桌子

StoreID   TotalSales   Month  Year
  --      ----------   -----  ----
  1         10           1    2012
  2         2            1    2012
  3         15           1    2012
  1         4            2    2012
  2         5            2    2012

我需要:对于每个独特的“月/年”,抓住销售额最高的前两个StoreID。

我对如何做到这一点感到茫然。我尝试使用cross apply,但这似乎不起作用。这一切都在我脑海中,所以希望有人可以给我一个正确方向的推动。

1 个答案:

答案 0 :(得分:2)

此查询使用Common Table ExpressionWindow Function来获取行中的所有列。它适用于SQL Server 2005 and up

WITH records
AS
(
    SELECT  StoreID, TotalSales , Month, Year,
            DENSE_RANK() OVER (PARTITION BY Month, Year
                                ORDER BY TotalSales DESC) rn
    FROM    tableName
)
SELECT  StoreID, TotalSales , Month, Year
FROM    records
WHERE   rn <= 2