【发布时间】:2023-03-14 16:22:01
【问题描述】:
我有一个包含 1000 条记录的数据库,每行包含一个文件名和一个文件大小。 如果所有文件大小的总和超过特定限制,则: - 我需要创建一个 sql 查询来删除所有剩余的行,从最旧到最新
有什么建议吗? 谢谢
【问题讨论】:
我有一个包含 1000 条记录的数据库,每行包含一个文件名和一个文件大小。 如果所有文件大小的总和超过特定限制,则: - 我需要创建一个 sql 查询来删除所有剩余的行,从最旧到最新
有什么建议吗? 谢谢
【问题讨论】:
假设这样创建了一个表:
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 是可选的。
【讨论】:
可能最简单的解决方案(即使有很多行仍然很快)是在应用程序中计算运行总数:
select createdDate, size from files order by createdDate desc
现在读取结果集,并在循环中使用 total += size。总数变大后,删除比当前 createdDate 更早的所有内容:
delete from files where createdDate < ?
其他一些数据库(例如 MySQL 和 H2)支持高效的运行总计,但不支持 SQLite。
【讨论】:
进行二分查找。检查 500 个最新文件的总和是否小于限制,如果是,则 750 的总和是否低于限制等。直到您获得应该开始删除的行。然后只需DELETE WHERE file_date > date_of_your_last_row_below_limit。
【讨论】: