Това може да е решение на проблема ви.
Въпреки това, тъй като няма колона за дата и час, предполагам, че колоната id е първичният ключ. И това е Auto_increment
. Така че моето предположение е, че колкото по-голямо е числото, толкова по-нов е записът. (трябва да е вярно, освен ако не сте имали някои стари дъмпове на данни в таблицата)
Уверете се, че сте архивирали данните си, преди да ги изтриете, тъй като това ще доведе до трайна загуба на данни. Още по-добре, можете да направите копие на текущата таблица в друга таблица и да работите върху новата таблица, за да сте сигурни, че логиката по-долу е правилна. След това променете заявките, които имам по-долу, за да чета от tbl_new
вместо това на tbl
можете да дублирате вашата таблица чрез нещо като
CREATE TABLE tbl_new LIKE tbl;
Оставих коментари за всяко запитване
DROP TEMPORARY TABLE IF EXISTS keepers1, keepers2, keepers_all;
-- get the #1 top records
CREATE TEMPORARY TABLE keepers1 (KEY(id)) ENGINE=MEMORY AS
SELECT fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c, MAX(id) AS id
FROM tbl
GROUP BY fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c;
-- get the #2 top records
CREATE TEMPORARY TABLE keepers2 AS
SELECT fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c, MAX(id) AS id
FROM tbl AS k
WHERE NOT EXISTS (SELECT 1 FROM keepers1 WHERE id = k.id)
GROUP BY fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c;
-- create a temp table where you have all he ids that you want to keep
CREATE TEMPORARY TABLE keepers_all (KEY(id)) ENGINE=MEMORY AS
SELECT id FROM keepers1
UNION ALL
SELECT id FROM keepers2;
-- delete all records that you don't want to keep
DELETE k.* FROM tbl AS k WHERE NOT EXISTS (SELECT 1 FROM keepers_all WHERE id = k.id);
ако това е еднократна задача за почистване, тогава трябва да можете да изпълнявате заявките от конзолата. но ако търсите работа за набиране на персонал, вероятно трябва да вземете този код и да го поставите в процедура.
Забележка:тук използвам таблици MEMORY TEMPORARY за по-добра производителност. Може да срещнете проблем, който казва "Таблицата е пълна" това е защото имате твърде много записи. тогава можете да увеличите стойността max_heap_table_size за сесията, нещо като
SET SESSION tmp_table_size = 1024 * 1024 * 1024 * 2; -- this will set it to 2G
SET SESSION max_heap_table_size = 1024 * 1024 * 1024 * 2; -- this will set it to 2G
Това ще ви даде текущата ви стойност
SELECT VARIABLES LIKE 'max_heap_table_size';
SELECT VARIABLES LIKE 'tmp_table_size';