2010-09-09 54 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的。