Вы можете попробовать это, это более сложно, но гораздо безопаснее, потому что использование внутреннего удаления может быть очень опасным, поэтому вы можете сначала проверить, что вы хотите удалить:
SET @discriminator = 0;
SET @p1 = null;
SET @p2 = null;
CREATE TEMPORARY TABLE temp_rows(
`id` INT PRIMARY KEY,
`index` INT,
`col1` COL1TYPE,
`col2` COL2TYPE
);
INSERT INTO temp_rows (`index`, `col1`, `col2`, `id`)
SELECT CASE WHEN @p1 != col1 OR @p2 != col2 THEN @discriminator := 0 ELSE @discriminator := @discriminator + 1 END AS 'index',
@p1 := col1 AS 'col1',
@p2 := col2 AS 'col2',
id
FROM `schema`.table
ORDER BY col1, col2, id desc;
DELETE FROM table WHERE EXISTS (
SELECT 1 FROM `temp_rows`
WHERE table.`id` = temp_rows.`id`
);
DROP TEMPORARY TABLE temp_rows;