Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Keep only N last records in SQLite database, sorted by date

I have an SQLite database that I need to do the following: Keep only last N records, sorted by date. How do you do that?

like image 581
ahmd0 Avatar asked Jun 29 '11 22:06

ahmd0


4 Answers

To delete all but the latest 10 records.

delete
from test
where id not in (
    select id
    from test
    order by date desc
    limit 10
)
like image 175
Jacob Eggers Avatar answered Sep 19 '22 09:09

Jacob Eggers


According to the SQLite documentation:

If SQLite is compiled with the SQLITE_ENABLE_UPDATE_DELETE_LIMIT compile-time option, then the syntax of the DELETE statement is extended by the addition of optional ORDER BY and LIMIT clauses.

(...)

If the DELETE statement has an ORDER BY clause, then all rows that would be deleted in the absence of the LIMIT clause are sorted according to the ORDER BY. The first M rows, where M is the value found by evaluating the OFFSET clause expression, are skipped, and the following N, where N is the value of the LIMIT expression, are deleted. If there are less than N rows remaining after taking the OFFSET clause into account, or if the LIMIT clause evaluated to a negative value, then all remaining rows are deleted.

This would allow you to write:

DELETE FROM table WHERE expr ORDER BY date DESC LIMIT -1 OFFSET 10
like image 32
Martín Valdés de León Avatar answered Sep 23 '22 09:09

Martín Valdés de León


to keep only the last 10 records, think inverted.

To delete the older 10 records:

DELETE FROM Table_name 
WHERE date in (SELECT date FROM Table_name ORDER BY Date Desc Limit -1 
               OFFSET  (select count(*)-10 from Table_name) );

Let me know how it worked for you!

like image 21
Marcelo Saied Avatar answered Sep 23 '22 09:09

Marcelo Saied


Assuming you have an id column which is a sequential number (AUTO INCREMENT), you can use the following:

DELETE FROM table_name
WHERE id < (
    SELECT MIN(id)
    FROM (SELECT id
          FROM table_name
          ORDER BY id DESC
          LIMIT num_of_records_to_keep))

The same query can be used when using a timestamp column (simply replace id with your timestamp column)

like image 37
Muzikant Avatar answered Sep 20 '22 09:09

Muzikant