Вот один из вариантов:
DELETE
FROM yourTable
WHERE score NOT IN (SELECT DISTINCT score
FROM yourTable
ORDER BY score DESC LIMIT 5);
Этот ответ будет устойчивым к связям в топ-5, но будет иметь поведение при возвращении, возможно, более 5 записей, причем все эти записи будут иметь оценку вверхние 5 в целом.
Если бы было доступно ROW_NUMBER
, мы могли бы попробовать что-то вроде:
WITH cte AS (
SELECT id, score, ROW_NUMBER() OVER (ORDER BY score DESC) rn
FROM yourTable
)
DELETE
FROM yourTable
WHERE id IN (SELECT id FROM cte WHERE rn <= 5);
Опять же, возникает вопрос о том, как обращаться со связями.Возможно, вы захотите использовать DENSE_RANK
вместо ROW_NUMBER
.