Найти и удалить записи SQL, если они произошли в течение 8 часов (кроме самой последней записи) - PullRequest
0 голосов
/ 04 июня 2018

У меня есть таблица SQL, которая содержит дубликаты записей, которые я хочу удалить.Удаление должно происходить одновременно в двух условиях:

  1. Записи имеют одинаковое значение в столбце score 1005 *
  2. Записи произошли в течение 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

1 Ответ

0 голосов
/ 04 июня 2018

Я считаю, что вам нужна функция DATE_SUB

DATE_SUB(it.visited_at, INTERVAL 8 HOUR)

Это создаст дату и время, которые вы можете сравнить, чтобы найти вещи в течение 8 часов после данной записи.Я бы написал больше ответов, но похоже, что это единственная часть головоломки, которую вам не хватает.

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