2012-11-02 56 views
1

由于我的应用程序中存在一个错误,因此建立了一个用于运载每个交付周期的每日记录的表,该表被多次填充。删除重复的批量数据

可以说我从6月1日到6月5日有货。我的表格应该填入5条记录,每天一条记录。现在,我有很大的破坏性,因为我有很多相同内容的“批次”。

表的布局是:

dummy_id  -- identity column 
delivery_id -- id of the delivery 
on_date  -- the day 
charge   -- the daily cost 

有一种优雅的方式,让首批仅有的记录和删除插入错误的所有交付的批次?

+0

你知道你要保持批次的ID?您可以删除除ID – Gage

+1

以外的所有信息,因此每天有多个记录,哪些应该只有一个? –

+0

您是否有任何日期和时间字段记录每天插入记录的时间? –

回答

2

要删除所有的受骗者为delivery_id, on_date, charge保持与最低dummy_id

;WITH cte 
    AS (SELECT ROW_NUMBER() OVER (PARTITION BY delivery_id, 
               on_date, 
               charge 
             ORDER BY dummy_id) RN 
     FROM YourTable) 
DELETE FROM cte 
WHERE RN > 1 
+0

Thanx!对不起,如果这是一个愚蠢的问题,但是什么是;与? – PanosPlat

+0

@ user597243需要分号来终止对公用表表达式声明的前面的语句。在我的回答中添加分号只是一种先发制人的措施,以防将其粘贴到非分号结尾的语句集的中间。 –

+0

Thanx!我将创建一个测试环境来检查它,我会回来!似乎科幻:) – PanosPlat

1

一个你可以试试:

这是要知道你会删除该行:

SELECT * FROM YOUR_TABLE WHERE DUMMY_ID NOT IN (
    SELECT MIN(DUMMY_ID) FROM YOUR_TABLE GROUP BY DELIVERY_ID) 

这将删除这些行:

DELETE FROM YOUR_TABLE WHERE DUMMY_ID NOT IN (
    SELECT MIN(DUMMY_ID) FROM YOUR_TABLE GROUP BY DELIVERY_ID) 
1

尝试

DELETE FROM table WHERE dummy_id NOT IN (SELECT MIN(dummy_id) FROM table GROUP BY on_date)