sql >> Base de Datos >  >> RDS >> PostgreSQL

Mantenga solo los últimos 5 resultados de búsqueda del usuario en una tabla

Sintaxis adecuada como se detalla en el manual :

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;

Donde pk_id es cualquier (combinación de) columna(s) que es única . Podría ser user_id , search_time en su caso, o, más convenientemente, una clave principal sustituta.

Por solo un sencillo user_id puedes simplificar a:

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;

Por otro lado, para tratar con múltiples usuarios a la vez, debe agregar PARTITION BY a su función de ventana:

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;