Korrekte Syntax wie im Handbuch beschrieben :
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;
Wobei pk_id
ist eine beliebige (Kombination von) Spalte(n), die eindeutig ist . Könnte user_id
sein , search_time
in Ihrem Fall - oder, bequemer, ein Ersatz-Primärschlüssel.
Für nur eine Single user_id
Sie können vereinfachen zu:
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;
Andererseits, um mit mehreren umzugehen Benutzer gleichzeitig, müssen Sie PARTITION BY
hinzufügen zu Ihrer Fensterfunktion:
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;