如何根据组删除某些行?

时间:2013-12-05 16:56:42

标签: sql sql-server group-by delete-row

我有一个棘手的问题。我需要从表中删除行,但只删除那些不是组中的最大条目的行。这是一个例子: 小组是(月,水果)。

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

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

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

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

表是声明的变量@tempTable,首选删除它是首选。我使用的是SQL Server 2008 R2。

1 个答案:

答案 0 :(得分: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;

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

SQLfiddle demo