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;