2013-08-26 34 views
-1

假設我有一個名爲「庫存」的表,其中每天列出每個項目及其數量。如何通過SQL中的一組行重複刪除

inventory 
--------------------- 
day | item | quantity 
1 Apples 5 
1 Oranges 3 
2 Apples 5 
2 Oranges 3 
3 Apples 5 
3 Oranges 3 
3 Peaches 8 
4 Apples 5 
4 Oranges 3 
4 Peaches 8 
5 Apples 2 
5 Oranges 3 
5 Peaches 8 

通過去重複,我想擺脫與前一天具有完全相同數據的任何一天。所以得到的表應該看起來像這樣:

inventory 
--------------------- 
day | item | quantity 
1 Apples 5 
1 Oranges 3 
3 Apples 5 
3 Oranges 3 
3 Peaches 8 
5 Apples 2 
5 Oranges 3 
5 Peaches 8 

有關如何做到這一點的任何想法?

+1

你想要的結果包括「3,蘋果,5」。該行(和其他一些行)是否應該達到您想要的結果?因爲前一天還有另外一行「2,蘋果5」。 – supergrady

+0

是的,它應該。由於第3天發生更改,因此第3天的EVERY應該位於結果集中。 – satnam

+0

OP在一些答案後更改了問題。 –

回答

1

如果你要考慮一些失蹤的日子,您可以使用這樣的查詢:

SELECT 
    i.day, i.item, i.quantity 
FROM (
    SELECT t1.day, t1.item, t1.quantity, MAX(t2.day) as prec_day 
    FROM 
    inventory t1 LEFT JOIN inventory t2 
    ON t1.item=t2.item AND t1.day>t2.day 
    GROUP BY 
    t1.day, t1.item, t1.quantity) i 
    LEFT JOIN inventory i2 
    ON i.item=i2.item AND i.prec_day=i2.day 
WHERE 
    i2.day IS NULL or i.quantity<>i2.quantity 

請參閱小提琴here

編輯:如果需要顯示所有項目只要有至少一個變化,你可以這樣做:

SELECT 
    inventory.* 
FROM 
    inventory 
WHERE 
    day IN (
    SELECT 
     i.day 
    FROM (
     SELECT t1.day, t1.item, t1.quantity, MAX(t2.day) as prec_day 
     FROM 
     inventory t1 LEFT JOIN inventory t2 
     ON t1.item=t2.item AND t1.day>t2.day 
     GROUP BY 
     t1.day, t1.item, t1.quantity) i 
     LEFT JOIN inventory i2 
     ON i.item=i2.item AND i.prec_day=i2.day 
    WHERE 
     i2.day IS NULL or i.quantity<>i2.quantity) 

小提琴是here

+0

,看起來是正確的,但現在我試圖弄清楚這是如何工作的,以便我可以將它應用於我的實際問題(這有點複雜)。謝謝 – satnam

0

我相信是這樣的:

Select day, (Select Item, Quantity From tables Where Criteria) From tables Where Criteria Group By Day. 

可能工作

0

下面的解決方案是利用一個協調的子選擇的。

select day, item, quantity 
from yourTable t 
where quantity <> (select quantity from yourTable y where y.day = t.day - 1 and y.item = t.item) 

測試它,它的工作原理,至少據我瞭解的問題。

+0

嗯,如果我每天都有數據,這是有效的。可能有幾天我會丟失數據。所以,如果第7天和第8天不見了,第9天應該檢查第6天,看它是否是重複的。 – satnam

0

您可以使用LEFT JOIN查找與前一天相同的庫存料品,並將其排除在WHERE子句中。這是一個SQLFiddle

SELECT 
    inv.day 
    ,inv.item 
    ,inv.quantity 
FROM inventory AS inv 
LEFT JOIN inventory AS prev_day 
    ON prev_day.day = inv.day - 1 
    AND prev_day.item = inv.item 
    AND prev_day.quantity = inv.quantity 
WHERE prev_day.day IS NULL 
+0

唯一的問題是,我試圖按天清理DAY,而不是按行排序。注意你的結果集和我想要的結果集之間的差異。 – satnam