you can do it like this, as your code isn't valid
I assume you have an auto_increnet that has a column name of id
Still, this is very dangerous, so it should be tested on a sample database or dbfidlle
WITH CTE AS
(
SELECT *, ROW_NUMBER()OVER(PARTITION BY publisher ORDER BY publisher)
AS RowNumber
FROM idpublisher
)
delete FROM idpublisher WHERE id IN (SELECT id FROM CTE WHERE RowNumber > 1)
Or use a INNER JOIN
WITH CTE AS
(
SELECT *, ROW_NUMBER()OVER(PARTITION BY publisher ORDER BY publisher)
AS RowNumber
FROM idpublisher
)
delete idpublisher FROM idpublisher JOIN CTE ON idpublisher.id = CTE.id WHERE CTE.RowNumber > 1