sqlite过滤总和

时间:2010-09-09 08:51:09

标签: sql sqlite

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

有什么建议吗? 感谢

3 个答案:

答案 0 :(得分: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是可选的。

答案 1 :(得分:2)

可能最简单的解决方案(即使有很多行仍然很快)是计算应用程序中的运行总计:

select createdDate, size from files order by createdDate desc

现在读取结果集,并在循环中使用total + = size。一旦总数较大,删除比当前createdDate更旧的所有内容:

delete from files where createdDate < ?

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

答案 2 :(得分:0)

进行二元搜索。检查500个最新文件的总和是否小于限制,如果是,如果750的总和低于限制等等。直到你得到应从中开始删除的行。然后只需DELETE WHERE file_date > date_of_your_last_row_below_limit