Если вы хотите сохранить только самую последнюю партию для каждого запаса, я бы порекомендовал один из следующих:
with todelete as (
select sb.*,
row_number() over (partition by stockid order by batchid desc) as seqnum
from stock_batch sb
)
delete from todelete
where seqnum = 1;
Или:
delete sb from stock_batch sb
where sb.batchid < (select max(sb2.batchid)
from stock_batch sb2
where sb.stockid = sb2.stockid
);
Оба из них могут занятьпреимущество индекса на stock_batch(stockid, batchid)
.Однако, если вы удаляете много строк, это все равно может быть медленным.В этом случае есть другие подходы, которые могут быть быстрее.