Sintaks yang tepat seperti yang dijelaskan dalam 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;
Dimana pk_id
adalah setiap (kombinasi) kolom yang unik . Mungkin user_id
, search_time
dalam kasus Anda - atau, lebih mudahnya, kunci primer pengganti.
Hanya untuk tunggal user_id
Anda dapat menyederhanakan menjadi:
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;
Di sisi lain, untuk menangani banyak pengguna sekaligus, Anda perlu menambahkan PARTITION BY
ke fungsi jendela Anda:
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;