Найти и удалить записи SQL, если они произошли в течение 8 часов (кроме самой последней записи)

0

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

  1. Записи имеют одинаковое значение в соответствии с score колонкой
  2. Записи происходили в течение 8 часов друг от друга.

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

До сих пор мне удалось создать код, который удаляет такой дубликат, только если записи произошли в тот же день месяца, поэтому ему не хватает каких-либо записей, которые охватывают более двух последовательных дней - как это решить?

Оригинальная БД выглядит так:

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
  • 0
    Будут ли строки в тот же день, но, скажем, 9 часов назад, останется на месте?
  • 0
    да, такой ряд не должен удаляться
Показать ещё 3 комментария
Теги:
database
select
count

1 ответ

0

Я считаю, что вы ищете функцию DATE_SUB

DATE_SUB(it.visited_at, INTERVAL 8 HOUR)

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

  • 0
    Функция добавления, что неудивительно, DATE_ADD () --- stackoverflow.com/questions/589652/…
  • 0
    Это не поможет, так как просто даст дату и время после вычитания 8 часов из фактического времени посещения. в настоящее время я впервые создаю unixtimestam of visit_at, который дает общее количество секунд с 1 по 1970 г. После того, как у меня будет это общее количество секунд, я делю его на 86400 (секунд 24 часа), так что это даст значение деления, а дробное соотношение будет игнорироваться. таким образом, я могу получить одинаковое значение diff для того же дня и позже для группы по этому значению diff.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню