У меня есть таблица postgresql (v8.4) с идентификатором входа в систему и временными метками, и я хочу создать пакетный файл, который будет периодически запускаться для удаления записей, когда один и тот же идентификатор имеет более X количества записей в таблице.Кроме того, количество сохраняемых записей хранится в отдельной таблице и может быть разным для каждого идентификатора.
Соответствующие столбцы двух таблиц:
CREATE TABLE user_profile (
id varchar(256) PRIMARY KEY,
history_count integer
)
CREATE TABLE access_history (
id varchar(256),
login_time timestamp
)
Решение, которое я имеюРассмотрение включает в себя 3 команды SQL:
получить все идентификаторы входа с избыточным количеством записей
SELECT access_history.id, count(*), user_profile.history_count
FROM d_access_history
LEFT JOIN d_user_profile
ON access_history.id = user_profile.id
GROUP BY access_history.id, user_profile.history_count
HAVING count(*) > user_profile.history_count;
перебрать каждую запись из вышеприведенного запроса иполучить отметку времени для последней записи
SELECT login_time
FROM access_history
WHERE id = 'user id'
ORDER BY login_time DESC
OFFSET 200 LIMIT 1;
удалить записи старше, чем отметка времени, полученная из # 2
DELETE from access_history
WHERE id = 'user id'
AND login_time <= '2011-06-06 10:22:29.604156'
IПо общему признанию, я новичок в SQL, но чувствую, что должен быть более эффективный способ выполнения этой операции.
заранее спасибо