PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Manter apenas os últimos 5 resultados de pesquisa do usuário em uma tabela


Sintaxe adequada conforme detalhado no 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;

Onde pk_id é qualquer (combinação de) coluna(s) única . Pode ser user_id , search_time no seu caso - ou, mais convenientemente, uma chave primária substituta.

Por apenas um único user_id você pode simplificar para:
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 outro lado, para lidar com vários usuários de uma só vez, você precisa adicionar PARTITION BY para sua função de janela:
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;