PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Mantieni solo gli ultimi 5 risultati di ricerca dell'utente in una tabella

Sintassi corretta come dettagliato nel manuale :

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;

Dove pk_id è qualsiasi colonna (combinazione di) che è unica . Potrebbe essere user_id , search_time nel tuo caso - o, più convenientemente, una chiave primaria surrogata.

Solo per un single user_id puoi semplificare in:

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;

D'altra parte, per gestire più utenti contemporaneamente, è necessario aggiungere PARTITION BY alla tua funzione finestra:

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;