Удаление старых данных по 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 );
Желательно наличие индекса (logins, data).