Удаление старых данных по datetime

Просьба подсказать простой TSQL запрос для MSSQL есть данные типа:

logins   cards   data

login1   00555   2019-12-12 13:13:13.000
login1   00666   2020-12-12 13:13:13.000
login2   11111   2019-12-12 13:13:13.000
login3   33333   2018-12-12 13:13:13.000
login3   33333   2019-12-12 13:13:13.000
login3   33333   2020-12-12 13:13:13.000

нужно в этой БД найти и отсортировать дубли логинов, к примеру login3 повторяется в бд, нужно удалить строки которые старее самой последней даты

удалить:

login3 33333 2018-12-12 13:13:13.000

login3 33333 2019-12-12 13:13:13.000

оставить: login3 33333 2020-12-12 13:13:13.000 и так по всем логинам в бд


Ответы (2 шт):

Автор решения: Nick Proskuryakov

Создаем тестовый набор:

CREATE TABLE #MyTABLE (logins NVARCHAR(100), cards NVARCHAR(5), [data] datetime);
INSERT #MyTABLE
VALUES ('login1','00555','2019-12-12 13:13:13.000'),('login1','00666','2020-12-12 13:13:13.000'),
('login2','11111','2018-12-12 13:13:13.000'),('login3','33333','2018-12-12 13:13:13.000'),
('login3','33333','2019-12-12 13:13:13.000'),('login3','33333','2020-12-12 13:13:13.000');

Пишем CTE, нумеруем строки:

WITH del_duplicate AS
(
SELECT 
logins,
cards,
data,
ROW_NUMBER() OVER(PARTITION BY logins,cards ORDER BY [data] DESC) AS rn 
FROM #MyTABLE
)

Удаляем лишнее:

DELETE FROM del_duplicate WHERE RN > 1

Проверяем результат:

SELECT * FROM #MyTABLE

Удаляем временную таблицу:

DROP TABLE #MyTABLE

Подробнее о OVER Clause, ROW_NUMBER

→ Ссылка
Автор решения: Akina
DELETE
FROM sourcetable
WHERE EXISTS ( SELECT NULL
               FROM sourcetable t
               WHERE t.logins = sourcetable.logins
                 AND t.data > sourcetable.data );

fiddle

Желательно наличие индекса (logins, data).

→ Ссылка