2012-11-26 32 views
1

我有一個包含RUN_TIME和OPERATION_NAME列的表。我想通過刪除每個操作的N個以前的實例來修剪表。例如:如果輸入表是SQLITE 3 - 刪除每個項目早於N個的實例

RUN     OPERATION 
13/11/2012 05:39 GAM010P0 
14/11/2012 05:39 GAM010P0 
15/11/2012 05:39 GAM010P0 
13/11/2012 05:09 GAM020P0 
14/11/2012 05:09 GAM020P0 
15/11/2012 05:09 GAM020P0 
16/11/2012 05:09 GAM020P0 
01/11/2012 17:09 GAM060P0 

而且我想維持2種最近的每次操作的情況下,輸出將是:

RUN     OPERATION 
14/11/2012 05:39 GAM010P0 
15/11/2012 05:39 GAM010P0 
15/11/2012 05:09 GAM020P0 
16/11/2012 05:09 GAM020P0 
01/11/2012 17:09 GAM060P0 

一般情況下我使用RANK分析函數按RUN_TIME進行排序,並按OPERATION_NAME排序;然而,因爲這個表存在sqlite數據庫,我不能寫一個刪除SQL語句來實現這一點。

回答

1

您必須計算數據庫中存在相同操作的記錄數量。 如果對於一個特定的記錄,有兩個或兩個以上的其他記錄與時間戳是新的,那麼這個記錄應該被刪除:

DELETE FROM MyTable 
WHERE (SELECT COUNT(*) 
     FROM MyTable AS Newer 
     WHERE Newer.OPERATION = MyTable.OPERATION AND 
      Newer.RUN > MyTable.RUN 
    ) >= 2 

請不,你必須使用一個日期格式像yyyy-mm-dd與在開始的最重要的領域,以便日期比較工作。