sqlite фильтрация по сумме - PullRequest
       40

sqlite фильтрация по сумме

2 голосов
/ 09 сентября 2010

У меня есть база данных с 1000 записями, содержащими имя файла и размер файла в каждой строке. Если сумма всех размеров файлов превышает определенный предел, то: - Мне нужно создать SQL-запрос, чтобы удалить все оставшиеся строки, от самых старых до самых новых

Есть предложения? Спасибо

Ответы [ 3 ]

5 голосов
/ 10 сентября 2010

Предположим, таблица создана следующим образом:

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;

Чтобы удалить идентификаторы файлов выше порога:

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 необязательно.

2 голосов
/ 09 сентября 2010

Вероятно, самое простое решение (которое по-прежнему быстро даже со многими строками) - это вычисление промежуточного итога в приложении:

select createdDate, size from files order by createdDate desc

Теперь прочитайте набор результатов и используйте в цикле total + = size. Как только общая сумма станет больше, удалите все, что старше текущей созданной даты:

delete from files where createdDate < ?

Некоторые другие базы данных (например, MySQL и H2) поддерживают эффективные промежуточные итоги, но не SQLite.

0 голосов
/ 09 сентября 2010

Сделайте бинарный поиск.Проверьте, меньше ли сумма 500 новых файлов, чем предел, если это так, если сумма 750 ниже предела и т. Д. До тех пор, пока вы не получите строку, с которой вы должны начать удаление.Тогда просто DELETE WHERE file_date > date_of_your_last_row_below_limit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...