2010-09-09 66 views
2

我有一个数据库,每行有1000个记录,包含文件名和文件大小。 如果所有文件大小总和超过一个特定的限制,则: - 我需要创建一个SQL查询来删除所有剩余行,从最旧到最新sqlite过滤总和

有什么建议? 谢谢

回答

5

假设表由此产生:

CREATE TABLE Files (Id INTEGER PRIMARY KEY, FileName TEXT, CreationDate DATE, Size INTEGER); 

要获得运行总和,请使用以下查询:

SELECT f1.id AS FileId, sum(f2.size) AS RunningSumSize 
FROM file f1 INNER JOIN file f2 
ON f1.createdDate<=f2.createdDate 
GROUP BY FileId 
ORDER BY RunningSumSize DESC; 

要删除ID的阈值以上的文件:

DELETE FROM File WHERE Id IN 
(SELECT FileId FROM 
    (SELECT f1.id AS FileId, sum(f2.size) AS RunningSumSize 
    FROM file f1 INNER JOIN file f2 
    ON f1.createdDate<=f2.createdDate 
    GROUP by FileId 
    ORDER by RunningSumSize DESC) 
    WHERE RunningSumSize > :ThresholdSize:); 

注意:order by是可选的。

0

做二分查找。检查500个最新文件的总和是否小于限制,如果是,如果总和小于等于750等等。直到你得到你应该开始删除的行。然后只需DELETE WHERE file_date > date_of_your_last_row_below_limit

+0

听起来不错,但我需要在sql语句中执行此操作。你能举个例子吗? – phm 2010-09-09 09:08:20

2

也许最简单的解决方案(即仍然很快,甚至有许多行)是计算在应用程序中运行总计:

select createdDate, size from files order by createdDate desc 

现在读的结果集,并在循环使用总+ =大小。一旦总较大,删除一切比目前createdDate以上:

delete from files where createdDate < ? 

其他一些数据库(如MySQL和H2)支持高效的运行总计,但不是SQLite的。