Доступ к SQL-запросу для удаления всех, кроме последней максимальной даты с критериями - PullRequest
1 голос
/ 26 сентября 2019

У меня есть таблица с логином и датой, и я хочу сохранить только N последних соединений для каждой записи со специальным внешним идентификатором

Пример: Я хочу сохранить последние 2 соединения (2 последние даты для каждого idexternal) в моей таблице, поэтому я хотел бы сделать лучший запрос на удаление, чтобы сделать это (есть ли другой способ, чем «где не в»?).У меня в таблице несколько миллионов записей ...

Таблица: логин

id, idExternal, DateLogin
 1,          1, 2019/09/20 -> DELETE 
 2,          1, 2019/09/21 -> DELETE
 3,          1, 2019/09/22 -> KEEP
 4,          1, 2019/09/23 -> KEEP
 5,          2, 2019/09/20 -> DELETE 
 6,          2, 2019/09/21 -> DELETE
 7,          2, 2019/09/22 -> KEEP
 8,          2, 2019/09/24 -> KEEP
 9,          3, 2019/09/23 -> DELETE
10,          3, 2019/09/24 -> KEEP
11,          3, 2019/09/25 -> KEEP
12,          4, 2019/09/22 -> KEEP

Как это можно сделать только с помощью SQL-запроса?

Спасибо

1 Ответ

2 голосов
/ 26 сентября 2019

Вы можете использовать коррелированный подзапрос.Вот один из методов:

select t.*
from t
where t.datelogin in (select top (2) t2.datelogin
                      from t as t2
                      where t2.idExternal = t.idExternal
                      order by t2.datelogin desc
                     );

Для delete:

delete from t
    where t.datelogin not in (select top (2) t2.datelogin
                              from t as t2
                              where t2.idExternal = t.idExternal
                              order by t2.datelogin desc
                             );

Индекс на (idExternal, datelogin) поможет этому запросу.Однако если вам нужно удалить много строк, запрос будет неэффективным.Часто лучше создать новую таблицу только с теми строками, которые вам нужны, обрезать старую таблицу и заново вставить значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...