sql >> Database >  >> RDS >> PostgreSQL

Bewaar alleen de laatste 5 zoekresultaten van de gebruiker in een tabel

Juiste syntaxis zoals beschreven in de handleiding :

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;

Waar pk_id is elke (combinatie van) kolom(men) die uniek is . Mogelijk user_id , search_time in jouw geval - of, handiger, een surrogaat primaire sleutel.

Voor slechts een enkele user_id u kunt vereenvoudigen tot:

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;

Aan de andere kant, om te gaan met meerdere gebruikers tegelijk, moet u PARTITION BY . toevoegen naar uw vensterfunctie:

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. Hoe kan ik zoeken naar tekst die emoji's bevat?

  2. Schending van integriteitsbeperking:1052 Kolom 'id' in waar clausule dubbelzinnig is

  3. Kan MySQL niet stoppen op OS X 10.10

  4. SQL krijgt ROW_NUMBER en COUNT op elk SELECT-verzoek