PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Ne conserver que les 5 derniers résultats de recherche de l'utilisateur dans un tableau

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;

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;