Korrekt syntax som beskrivs i manualen :
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;
Där pk_id
är vilken (kombination av) kolumn(er) som helst som är unika . Kan vara user_id
, search_time
i ditt fall - eller, mer bekvämt, en surrogat primärnyckel.
För bara en singel user_id
du kan förenkla till:
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;
Å andra sidan, att hantera multipel användare på en gång måste du lägga till PARTITION BY
till din fönsterfunktion:
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;