PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Bewahren Sie nur die letzten 5 Suchergebnisse des Benutzers in einer Tabelle auf

Korrekte Syntax wie im Handbuch beschrieben :

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;

Wobei pk_id ist eine beliebige (Kombination von) Spalte(n), die eindeutig ist . Könnte user_id sein , search_time in Ihrem Fall - oder, bequemer, ein Ersatz-Primärschlüssel.

Für nur eine Single user_id Sie können vereinfachen zu:

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;

Andererseits, um mit mehreren umzugehen Benutzer gleichzeitig, müssen Sie PARTITION BY hinzufügen zu Ihrer Fensterfunktion:

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;