У меня есть таблица SQL, которая содержит некоторые дубликаты записей, которые я хочу удалить. Удаление должно происходить в двух условиях:
score
колонкойУдаленные записи должны быть те, у которых более старая дата, среди всех совпадающих записей, поэтому в новом результате запроса должна присутствовать только самая последняя запись среди совпадающих записей.
До сих пор мне удалось создать код, который удаляет такой дубликат, только если записи произошли в тот же день месяца, поэтому ему не хватает каких-либо записей, которые охватывают более двух последовательных дней - как это решить?
Оригинальная БД выглядит так:
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
Я считаю, что вы ищете функцию DATE_SUB
DATE_SUB(it.visited_at, INTERVAL 8 HOUR)
Это создаст дату и время, которое вы можете сравнить, чтобы найти вещи в течение 8 часов после записи. Я бы написал больше ответа, но похоже, что это единственный фрагмент головоломки, которую вы не видите.