Если я правильно понял, вы хотите удалить все записи, для которых запись с одинаковым dup_id
(но с более высоким ogc_fid) существует. И оставляйте только те, у кого самый высокий ogc_fid.
-- DELETE -- uncomment this line and comment the next line if proven innocent.
SELECT COUNT(*)
FROM mytble mt
WHERE EXISTS (
SELECT *
FROM mytble nx
WHERE nx.dup_id = mt.dup_id -- there exists a row with the same dup_id
AND nx.ogc_fid > mt.ogc_fid -- , ... but with a higher ogc_fid
);
С индексом для dup_id (и, возможно, для ogc_id) это должно работать, может быть, несколько минут для записей 41M.
ОБНОВЛЕНИЕ: если индексов не существует, вы могли бы ускорить вышеуказанные запросы, сначала создав индекс:
CREATE UNIQUE INDEX sinterklaas ON mytble (dup_id, ogc_id);