Syntaxe appropriée comme détaillé dans le manuel :
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;
Où pk_id
est une (combinaison de) colonne(s) qui est unique . Peut être user_id
, search_time
dans votre cas - ou, plus commodément, une clé primaire de substitution.
Pour juste un célibataire user_id
vous pouvez simplifier :
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;
En revanche, pour faire face à plusieurs utilisateurs à la fois, vous devez ajouter PARTITION BY
à votre fonction de fenêtre :
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;