我有一个包含1000条记录的数据库,每行包含一个文件名和一个文件大小。 如果所有文件大小的SUM超过特定限制,则: - 我需要创建一个sql查询来删除从最旧到最新的所有剩余行
有什么建议吗? 感谢
答案 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
。