Mysql удаляет записи старше 7 дней, оставляя lasr 1 запись для каждого device_id - PullRequest
0 голосов
/ 08 июля 2019

у меня есть таблица с device_id и датой и временем со скоростью, как показано ниже

 id | device_id |      server_time    | speed
 ---+-----------+---------------------+-------
 1  |     3     | 2019-06-24 13:35:37 |   25
 2  |     2     | 2019-06-22 13:35:37 |   35
 3  |     2     | 2019-06-27 15:15:22 |   23
 4  |     3     | 2019-06-24 13:35:37 |   54
 5  |     1     | 2019-06-20 13:35:37 |   55
 6  |     4     | 2019-06-10 13:35:37 |   34
 7  |     3     | 2019-06-24 13:35:37 |   4
 8  |     1     | 2019-06-21 13:35:37 |   25

Я хочу удалить записи старше 7 дней, но мне нужно сохранить как минимум 1 запись для каждого device_id, даже если он старше 7 дней.

Как мне этого добиться с помощью mysql?

Ответы [ 3 ]

1 голос
/ 08 июля 2019

Вы можете выполнить запрос, чтобы получить самый высокий идентификатор, как это было в запросе из вашего комментария , и удалить все строки, где время старше 7 дней, а не самый высокий идентификатор для каждой группы.

Поскольку MySQL не может использовать подзапрос в своей собственной таблице в запросах на обновление / удаление, вы можете использовать подзапрос для получения всех старших идентификаторов, сгруппированных по device_id.

Замените foo фактическим именем таблицы.

DELETE FROM foo
WHERE server_time < DATE_SUB(NOW(), INTERVAL 7 DAY) 
  AND id NOT IN(SELECT * 
                FROM (SELECT MAX(id) 
                      FROM foo 
                      GROUP BY device_id
                ) AS t)
0 голосов
/ 08 июля 2019

Я бы написал это как join:

delete t
    from <table> t join
         (select device_id,
                 max(server_time) as max_server_time,
                 max(id) as max_id
          from <table> t2
          group by device_id
         ) t2
         on t.device_id = t2.device_id
    where t.id < t2.max_id and
          t.server_time < t2.max_server_time - interval 7 day;
0 голосов
/ 08 июля 2019

Использование row_number()

delete from 
(
  select *, row_number() over(partition by device_id order by server_time desc) as rn
  from tablename where server_Time>=NOW() - INTERVAL 7 DAY
)A where rn<>1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...