Как удалить несколько дубликатов по дате в MS Access

У меня есть таблица имен и дат. Я хочу удалить строки, в которых есть дубликаты имен, и оставить только ту, у которой самая последняя дата. Иногда есть несколько повторяющихся строк информации.

Мой код ниже работает, однако я хотел бы запустить автоматический цикл, который останавливается, когда больше не обнаруживается дубликатов, ИЛИ узнать лучший/более эффективный способ сделать это.

С приведенным ниже кодом моя текущая процедура:

Запрос1 Запрос2 Запрос3

Повторяйте до тех пор, пока больше не будет удалено дубликатов.

Table1:

ID  Field1  Field2  Field3
3   Albert  Jacobsen 12/5/2018
5   Mia     Shaw     12/28/2018
6   Chris   Mantle   6/14/2018
7   Albert  Jacobsen 1/8/2019
8   Albert  Jacobsen 11/15/2018
9   Chris   Mantle   11/24/2018

Query 1:
SELECT Table1.Field1, Table1.Field2, Table1.Field3, Table1.ID INTO Table2
FROM Table1
GROUP BY Table1.Field1, Table1.Field2, Table1.Field3, Table1.ID
ORDER BY Table1.Field1 DESC , Table1.Field2 DESC , Table1.Field3 DESC;

Table2:
Field1  Field2  Field3  ID
Mia     Shaw     12/28/2018 5
Chris   Mantle   11/24/2018 9
Chris   Mantle   6/14/2018  6
Albert  Jacobsen 1/8/2019   7
Albert  Jacobsen 12/5/2018  3
Albert  Jacobsen 11/15/2018 8

Query 2:
SELECT Table2.Field1, Table2.Field2, Count(Table2.ID) AS CountOfID,                 
Min(Table2.ID) AS MinOfID INTO Temp_DeleteThese
FROM Table2
GROUP BY Table2.Field1, Table2.Field2
HAVING (((Count(Table2.ID))>1));

Table Temp_DeleteThese:
Field1  Field2  CountOfID MinOfID
Albert  Jacobsen 3  3
Chris   Mantle   2  6

Query 3:
DELETE DISTINCTROW Table1.*
FROM Temp_DeleteThese INNER JOIN Table1 ON Temp_DeleteThese.MinofID =             
Table1.ID;

Resulting Table1:
ID  Field1  Field2  Field3
5   Mia Shaw     12/28/2018
7   Albert  Jacobsen 1/8/2019
8   Albert  Jacobsen 11/15/2018
9   Chris   Mantle   11/24/2018

Как я могу зациклить код до тех пор, пока дубликаты не будут удалены и останется только самая последняя запись, или сделать это более эффективно?


person kdudeIA    schedule 09.01.2019    source источник
comment
Можете ли вы дать нам более эффективную количественную оценку? Это занимает шесть часов, и вы хотите, чтобы это заняло шесть минут или шесть секунд?   -  person Robert Harvey    schedule 09.01.2019
comment
Обычно правильные временные рамки составляют от шести часов до шести минут.   -  person kdudeIA    schedule 09.01.2019


Ответы (1)


Вы можете удалить все повторяющиеся записи в одном запросе, используя подзапрос EXISTS, чтобы убедиться, что существует строка с тем же именем и более поздней датой:

DELETE *
FROM Table1 t
WHERE EXISTS(
    SELECT 1
    FROM Table1 s
    WHERE s.Field1 = t.Field1
    AND s.Field2 = t.Field2
    AND s.Field3 > t.Field3
)

Это удаляет все строки, которые должны быть удалены за один раз. Я не думаю, что вы можете стать более эффективным, чем это.

person Erik A    schedule 09.01.2019