如何根据组删除某些行?

Szi*_*iro 1 sql sql-server group-by delete-row

我有一个棘手的问题.我需要从表中删除行,但只删除那些不是组中最大条目的行.这是一个例子:Group是(Month,Fruit).

Month      | Fruit  | Quantity
2013-01-01 | Apple  | 5
2013-02-01 | Apple  | 6
2013-03-01 | Apple  | 7
2013-03-01 | Apple  | 8
2013-01-01 | Banana | 5
2013-02-01 | Banana | 6
2013-02-01 | Banana | 7
Run Code Online (Sandbox Code Playgroud)

正确的过渡将是(每个月+水果组中只保留最高数量):

Month      | Fruit  | Quantity
2013-01-01 | Apple  | 5
2013-02-01 | Apple  | 6
2013-03-01 | Apple  | 8
2013-01-01 | Banana | 5
2013-02-01 | Banana | 7
Run Code Online (Sandbox Code Playgroud)

(我实际上需要有一个完整的日历 - 水果桌,每个月的每个水果.所以如果你设法添加2013-03香蕉,它不是一个问题,它是一个加号.)

Table是声明的变量@tempTable,从中直接删除是首选.我使用SQL Server 2008 R2.

Aar*_*and 7

;WITH x AS 
(
  SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY Fruit, Month ORDER BY Quantity DESC)
  FROM @tempTable
)
SELECT * FROM x
--DELETE x 
WHERE rn > 1;
Run Code Online (Sandbox Code Playgroud)

如果您对结果标识了要删除的正确行感到满意,请取消SELECT并取消注释DELETE.

SQLfiddle演示