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