Cú pháp phù hợp được nêu chi tiết trong sách hướng dẫn :
DELETE FROM history_user h
USING (
SELECT pk_id, row_number() OVER (ORDER BY search_time DESC) AS rn;
FROM history_user
WHERE user_id = 188
) sub
WHERE sub.rn > 5
AND h.pk_id = sub.pk_id;
Ở đâu pk_id
là bất kỳ (kết hợp của) cột nào là duy nhất . Có thể là user_id
, search_time
trong trường hợp của bạn - hoặc thuận tiện hơn là khóa chính thay thế.
Chỉ cho một đơn lẻ user_id
bạn có thể đơn giản hóa thành:
DELETE FROM history_user h
USING (
SELECT pk_id
FROM history_user
WHERE user_id = 188
ORDER BY search_time DESC
OFFSET 5
) sub
WHERE h.pk_id = sub.pk_id;
Mặt khác, để đối phó với nhiều người dùng cùng một lúc, bạn cần thêm PARTITION BY
vào chức năng cửa sổ của bạn:
DELETE FROM history_user h
USING (
SELECT pk_id, row_number() OVER (PARTITION BY user_id
ORDER BY search_time DESC) AS rn;
FROM history_user
) sub
WHERE sub.rn > 5
AND h.pk_id = sub.pk_id;