Вы можете использовать синтаксис удаления / объединения вместе с row_number()
(для последнего требуется MySQL 8.0) `:
delete t
from mytable t
inner join (
select
product_id,
date_in,
row_number() over(partition by product_id order by date_in desc) rn
from mytable t
) t1
on t1.product_id = t.product_id
and t1.date_in = t.date_in
and t1.rn > 2
В более ранних версиях мы можем элюировать row_number()
с подзапросом - при условии отсутствия дубликатов на (product_id, date_in)
:
delete t
from mytable t
inner join (
select
product_id,
date_in,
(select count(*) from mytable t2 where t2.product_id = t1.product_id and t2.date_in >= t1.date_in) rn
from mytable t1
) t1
on t1.product_id = t.product_id
and t1.date_in = t.date_in
and t1.rn > 2;