我有一個數據庫,每行有1000個記錄,包含文件名和文件大小。 如果所有文件大小總和超過一個特定的限制,則: - 我需要創建一個SQL查詢來刪除所有剩餘行,從最舊到最新sqlite過濾總和
有什麼建議? 謝謝
我有一個數據庫,每行有1000個記錄,包含文件名和文件大小。 如果所有文件大小總和超過一個特定的限制,則: - 我需要創建一個SQL查詢來刪除所有剩餘行,從最舊到最新sqlite過濾總和
有什麼建議? 謝謝
假設表由此產生:
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
是可選的。
做二分查找。檢查500個最新文件的總和是否小於限制,如果是,如果總和小於等於750等等。直到你得到你應該開始刪除的行。然後只需DELETE WHERE file_date > date_of_your_last_row_below_limit
。
也許最簡單的解決方案(即仍然很快,甚至有許多行)是計算在應用程序中運行總計:
select createdDate, size from files order by createdDate desc
現在讀的結果集,並在循環使用總+ =大小。一旦總較大,刪除一切比目前createdDate以上:
delete from files where createdDate < ?
其他一些數據庫(如MySQL和H2)支持高效的運行總計,但不是SQLite的。
聽起來不錯,但我需要在sql語句中執行此操作。你能舉個例子嗎? – phm 2010-09-09 09:08:20