2014-09-11 26 views
0

我必须删除每个帐户+ date_added组合的数据,这些数据超过N天。 通过N天的时候,它意味着此处删去比第一N个不同出现较老的上述组合删除N天以前的不同条目

DELETE 
FROM tbl_check 
    WHERE 
    N < (SELECT count(DISTINCT date_added) + 1 
    FROM tbl_check b 
    WHERE b.ACCOUNT_NUMBER = tbl_check.ACCOUNT_NUMBER 
    AND tbl_check.date_added < b.date_added) 

此查询必须在两者的Sybase ASE和Oracle运行。我已经写过上面的查询,它试图模拟DENSE_RANK,并且正在根据排名成功删除。

但是,它不使用任何索引,并且也是执行FTS的相关查询。该表中可能有成千上万行。 enter image description here

有复合PK是:FOREIGN_KEY_COL,ACCOUNT_NUMBER,DATE_ADDED .. 这是查询胜任工作,或者我们可以改进后,它给予相同的查询具有如提到的两个数据库工作。

+0

也有一些方法,使这项删除那些缓存将是很好 – fortm 2014-09-11 14:25:37

回答

0

为什么你不用下面的查询;

DELETE FROM tbl_check where (getdate()-date_added)> N 
+0

这是因为DATE_ADDED不相同每个ACCOUNT_NUMBER等的帐户1,data_added可能是SYSDATE,SYSDATE -1,-2 SYSDATE。 Account2只能有SYSDATE -2,SYSDATE -4,SYSDATE -5。如果N = 2,那么在清理之后,Account1应该删除SYSDATE -2,而account2应该删除SYSDATE -5 – fortm 2014-09-11 18:53:57