У меня есть таблица SQL, которая содержит дубликаты записей, которые я хочу удалить.Удаление должно происходить одновременно в двух условиях:
- Записи имеют одинаковое значение в столбце
score
1005 * - Записи произошли в течение 8 часов друг от друга.
Из всех совпадающих записей должны быть удалены те записи, которые имеют более старую дату, поэтому в новом результате запроса должна присутствовать только самая последняя запись среди совпадающих записей.
Пока мне удалось толькосоздать код, который удаляет такой дубликат, только если записи произошли в в тот же день месяца, поэтому в отсутствуют записи, охватывающие 2 последовательных дня - Как решить эту проблему?
Исходная БД выглядит так:
user_id score visited_at visit_id
------- ---------------- ------------------- ----------
22 75.0 2018-05-14 23:39:14 169
22 75.0 2018-05-14 18:36:26 168
22 75.0 2018-05-13 02:04:46 166
2 55.0 2018-05-12 18:38:24 165
22 78.0 2018-05-12 18:14:34 164
22 75.0 2018-05-12 18:45:12 164
22 55.0 2018-05-08 12:36:12 161
Команда SQL для частичного удаления дубликатов:
SELECT COUNT(*) AS ct
, it.user_id
, it.score
, UNIX_TIMESTAMP(CONVERT_TZ(it.visited_at,'+00:00',@@global.time_zone)) DIV 86400 AS diff
, it.visited_at
, it.visit_id
FROM `vw_items` it
GROUP
BY user_id
, score
, diff
ORDER
BY visited_at DESC
Результат:
ct user_id score diff visited_at visit_id
------ ------- ---------------- ------ ------------------- ----------
2 22 75.0 17665 2018-05-14 23:39:14 169
1 22 75.0 17664 2018-05-13 02:04:46 166
1 2 55.0 17663 2018-05-12 18:38:24 165
1 22 78.0 17663 2018-05-12 18:14:34 164
1 22 75.0 17663 2018-05-12 18:45:12 164
1 22 55.0 17659 2018-05-08 12:36:12 161
Но янужна команда, которая также удалит запись:
1 22 75.0 17663 2018-05-12 18:45:12 164
Поскольку она имеет тот же счет, что и другая запись, более поздняя, что произошло в течение 8 часов после этой записи:
1 22 75.0 17664 2018-05-13 02:04:46 166