Я недавно сталкивался с этой проблемой, и она действительно зависит от вашей стратегии «архивирования».
Я сделал то, что создал хранимую процедуру, которая выбирает записи для последующего архивируемого элемента для каждого пользователя.аккаунт (мое требование очень похоже на ваше в том смысле, что я должен выбрать 31-й элемент в учетной записи пользователя).Я также могу дать вам некоторый код здесь, если вы считаете, что он пригодится.
Я создал дополнительную таблицу с именем XXXX_archive, которая является клоном схемы в ваших таблицах shopping_list.Это делается для того, чтобы вставить туда старые архивные записи на тот случай, если пользователь попросит получить свой список в будущем (это, очевидно, необязательно, но может пригодиться).
Хранимая процедура находит эти записи и вставляет их вXXXX_archive таблицы, а затем удаляет их из XXXX.Это выполняется каждую ночь (или всякий раз, когда вы считаете это необходимым) через агента SQL Server.
В результате 13-й элемент не удаляется в тот момент, когда пользователь создает другой список покупок, но я думаю, что это нормальнопотому что вы отвечаете за свою стратегию архивирования и можете описать ее в своем TOS.
Просто подумал, что я должен написать свой опыт здесь, потому что я разобрался с этой проблемой всего несколько дней назад.
РЕДАКТИРОВАТЬ: Мой сохраненный процесс выглядит следующим образом: :
INSERT into shopping_lists_archive
SELECT *
FROM shopping_lists
WHERE id in (
select id
from (
SELECT ROW_NUMBER() OVER (
PARTITION BY user_ID
ORDER BY user_ID desc) AS RowNumber,
id, user_ID
FROM shopping_lists c
where c.user_ID in (select USER_ID from shopping_lists group by user_id having COUNT(1) > 12)
) t
where rownumber > 12
)
DELETE FROM shopping_lists
WHERE id in (
select id
from (
SELECT ROW_NUMBER() OVER (
PARTITION BY user_ID
ORDER BY user_ID desc) AS RowNumber,
id, user_ID
FROM shopping_lists c
where c.user_ID in (select USER_ID from shopping_lists group by user_id having COUNT(1) > 12)
) t
where rownumber > 12
)
Вот и все - это может немного отличаться от того, что вам нужно, потому что я архивирую на основе объединения двух таблиц, и мне пришлось изменить мой оригинальныйзапрос к вашему требованию.