Примечание - вы не сказали, на какой платформе будет работать следующее в SQL Server, Oracle, DB2 и др.
Следующий оператор даст вам 10 первых десяти строк
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY PRODUCT_ID ORDER BY SCORE DESC) AS RN
FROM SOME_TABLENAME_YOU_DID_NOT_SAY
) X
WHERE X.RN < 11
Итак, удалите все остальное
DELETE FROM SOME_TABLENAME_YOU_DID_NOT_SAY
WHERE ID NOT IN
(
SELECT ID
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY PRODUCT_ID ORDER BY SCORE DESC) AS RN
FROM SOME_TABLENAME_YOU_DID_NOT_SAY
) X
WHERE X.RN < 11
)