Sintassi corretta come dettagliato nel manuale :
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;
Dove pk_id
è qualsiasi colonna (combinazione di) che è unica . Potrebbe essere user_id
, search_time
nel tuo caso - o, più convenientemente, una chiave primaria surrogata.
Solo per un single user_id
puoi semplificare in:
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;
D'altra parte, per gestire più utenti contemporaneamente, è necessario aggiungere PARTITION BY
alla tua funzione finestra:
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;