To może być rozwiązanie Twojego problemu.
Ponieważ jednak nie ma kolumny daty i godziny, zakładam, że kolumna id jest kluczem podstawowym. I to jest Auto_increment
. Więc zakładam, że im większa liczba, tym nowszy rekord. (powinno to być prawdą, chyba że masz jakieś stare zrzuty danych w tabeli)
Upewnij się, że wykonałeś kopię zapasową danych przed ich usunięciem, ponieważ spowoduje to trwałą utratę danych. Co więcej, możesz skopiować bieżącą tabelę do innej tabeli i pracować nad nową tabelą, aby upewnić się, że poniższa logika jest poprawna. Następnie zmień zapytania, które mam poniżej, aby odczytać z tbl_new
zamiast tego na tbl
możesz zduplikować swój stół za pomocą czegoś takiego jak
CREATE TABLE tbl_new LIKE tbl;
Do każdego zapytania zostawiłem komentarze
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);
jeśli jest to jednorazowe zadanie czyszczenia, powinieneś być w stanie wykonać zapytania z konsoli. ale jeśli szukasz pracy rekrutacyjnej, prawdopodobnie powinieneś wziąć ten kod i umieścić go w procedurze.
Uwaga:tutaj używam tabel MEMORY TEMPORARY dla lepszej wydajności. Możesz napotkać problem, który mówi "Tabela jest pełna" dzieje się tak, ponieważ masz zbyt wiele rekordów. następnie możesz zwiększyć wartość max_heap_table_size dla sesjicoś jak
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
To da ci aktualną wartość
SELECT VARIABLES LIKE 'max_heap_table_size';
SELECT VARIABLES LIKE 'tmp_table_size';