sql >> Databasteknik >  >> RDS >> PostgreSQL

Behåll endast de fem senaste sökresultaten för användare i en tabell

Korrekt syntax som beskrivs i manualen :

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;

Där pk_id är vilken (kombination av) kolumn(er) som helst som är unika . Kan vara user_id , search_time i ditt fall - eller, mer bekvämt, en surrogat primärnyckel.

För bara en singel user_id du kan förenkla till:

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;

Å andra sidan, att hantera multipel användare på en gång måste du lägga till PARTITION BY till din fönsterfunktion:

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;



  1. Django inspectdb-problem med Oracle-databas

  2. 5 Microsoft Access tips och tricks

  3. Hur infogar man array i mysql med PDO och bindParam?

  4. Enkel SQL för att hämta olika information från olika tabeller