LINUX.ORG.RU

Как сделать SQL-запрос для удаления записей так, чтобы всегда оставалось 1000 последних записей

 ,


0

2

Есть SQLite база данных, в которую каждую минуту записывается несколько записей. В ней есть поле timeStamp, в котором хранится время добавления.

Задача: удалить записи, время добавления которых меньше определённого значения, но при этом всегда оставлять последние 1000 значений, независимо от их времени добавления.

Какой SQL-запрос можно использовать для решения такой задачи?

★★★★★

Мне думается, скопировать в новую базу последние записи будет быстрее и проще, чем организовать удаление устаревших.

Elyas ★★★★★
()
Ответ на: комментарий от Rastafarra

delete from table where primary_key in (select primary_key from table order by timestamp_fileld offset 1000)

Что-то я тут не вижу, где условие на время добавления записи.

Тут у тебя просто остаются последние 1000 записей.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

пропущенный desc уже подсказали, where в select добавь сам. не?

Rastafarra ★★★★
()
Ответ на: комментарий от Xintrea

order by timestamp_fileld offset 1000

Упорядочиваются по дате добавления и выбираются первые 1000. Нужно добавить desc, чтобы упорядочивание было по убыванию, тогда отберутся последние 1000. Но нужно еще in сменить на not in, т.к. ты хочешь удалить все кроме этих 1000 записей.

winlook38 ★★
()
Ответ на: комментарий от Xintrea

Нет, не трудно, просто пытался объяснить как это работает. Ты лучше описание таблицы выложи. А пока только несколько модифицированный вариант того, что уже давали: DELETE FROM table WHERE primary_key NOT IN (SELECT primary_key FROM table ORDER BY timestamp_fileld DESC OFFSET 1000).
Работает так: удаляются все записи, которые не входят (not in) в список последних (ORDER BY timestamp_field DESC) 1000 записей (OFFSET 1000).

winlook38 ★★
()
Ответ на: комментарий от winlook38

В топике написано: «время добавления которых меньше определённого значения». Пусть edgeValue - это и есть определенное значение.

Тут возникает вопрос:

WHERE timestamp_fileld < *edgeValue*

надо писать в подзапросе или в самом запросе?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от winlook38

попробовать бы ))

SELECT primary_key FROM table ORDER BY timestamp_fileld

выбрать, сортивароть по возрастанию. 1 2 3 4 5 6 7 8 9

DESC

развернуть: 9 8 7 6 5 4 3 2 1

OFFSET 1000

7 6 5 4 3 2 1

откусить голову, т.е. 9 и 8 пропустили, они самые свежие, их вроде надо оставить?

а ты делаешь «NOT IN », т.е. 9 и 8, свежие, как раз «все» :(.

нот ин лишний?

Rastafarra ★★★★
()
Последнее исправление: Rastafarra (всего исправлений: 1)
Ответ на: комментарий от Xintrea

сейчас придет второй джедай, оценит мои выкладки. имхо у меня деск пропущен, а у него нот ин лишний :)

Rastafarra ★★★★
()

время добавления которых меньше определённого значения
независимо от их времени добавления
но при этом всегда оставлять последние 1000 значений

ты сам-то понимаешь чего хочешь?
как тебе решить если ты даёшь противоречивые условия?
какаой условие важнее - «меньше определённого значения» или «всегда оставлять последние 1000 значений»?
что делать если «больше определённого значения» уже начнётся допустим с пятисотой записи?

q11q11 ★★★★★
()
Ответ на: комментарий от q11q11

Такой и условий: «меньше определённого значения» но «всегда оставлять последние 1000 значений»?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

ок, но что делать если «больше определённого значения» уже начнётся с пятисотой записи?
оставить 1000 но с неправильным временем или оставить 499 ?

q11q11 ★★★★★
()
Последнее исправление: q11q11 (всего исправлений: 3)
Ответ на: комментарий от Xintrea

меньше определённого значения

Так я и думал, что определенное время - это время 1000ой записи от конца. Ну добавь еще и это условие: DELETE FROM table WHERE primary_key NOT IN (SELECT primary_key FROM table ORDER BY timestamp_fileld DESC OFFSET 1000) or timestamp_field < :ts (если ты имел в виду, что нужно оставить 1000, а среди них удалить еще и те, у которых время создания меньше определенного).

winlook38 ★★
()
Ответ на: комментарий от winlook38

Ты путаешь оффсет и топ. Он как раз-таки с учетом деска скипнул первую (относительно выборки, относительно времени — последнюю) тысячу, удаляется все, что за ней по времени. Никакой нот-ин тут не нужен.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.