Удаление ежедневных дубликатов из БД MySQL на основе двух столбцов в определенный период дней - PullRequest
0 голосов
/ 13 октября 2019

Это беспокоит меня уже 2 дня, и я не могу разобраться с этим.

У меня есть таблица MySQL со следующей структурой:

 CREATE TABLE `sales` ( 
    `id` Int( 255 ) AUTO_INCREMENT NOT NULL,
    `created` DateTime NOT NULL,
    `user` VarChar( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    `client` VarChar( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    `status` VarChar( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    CONSTRAINT `unique_id` UNIQUE( `id` ) )
AUTO_INCREMENT = 1;

INSERT INTO `sales` ( `client`, `created`, `status`, `user`) 
VALUES 
( 'Google', '2019-05-06 00:00:00', 'active', 'john' ),
( 'Apple', '2019-05-06 00:00:00', 'active', 'john' ),
( 'Amazon', '2019-05-06 00:00:00', 'inactive', 'david' ),
( 'Apple', '2019-05-06 00:00:00', 'active', 'john' ),
( 'Amazon', '2019-05-07 00:00:00', 'active', 'john' ),
( 'Google', '2019-05-07 00:00:00', 'active', 'david' ),
( 'Apple', '2019-05-07 00:00:00', 'active', 'john' ),
( 'Amazon', '2019-05-07 00:00:00', 'inactive', 'david' ),
( 'Apple', '2019-05-07 00:00:00', 'active', 'john' );

Я пытаюсь достичь:

У пользователя может быть только один клиент в день,но иногда приложение отправляет несколько заявок из-за ошибки, которая была у нас за последние несколько месяцев, поэтому я хочу исключить ручную работу по очистке данных (экспортировать результаты в Excel и очистить, выполнив запрос, которыйигнорирует эти дубликаты (не удаляет их).

Возвращаясь к моим образцам данных:

+----+---------------------+-------+--------+----------+
| id | created             | user  | client | status   |
+----+---------------------+-------+--------+----------+
|  1 | 2019-05-06 00:00:00 | john  | Google | active   |
|  2 | 2019-05-06 00:00:00 | john  | Apple  | active   |
|  3 | 2019-05-06 00:00:00 | david | Amazon | inactive |
|  4 | 2019-05-06 00:00:00 | john  | Apple  | active   |
|  5 | 2019-05-07 00:00:00 | john  | Amazon | active   |
|  6 | 2019-05-07 00:00:00 | david | Google | active   |
|  7 | 2019-05-07 00:00:00 | john  | Apple  | active   |
|  8 | 2019-05-07 00:00:00 | david | Amazon | inactive |
|  9 | 2019-05-07 00:00:00 | john  | Apple  | active   |
+----+---------------------+-------+--------+----------+

Ожидаемые результаты после выполнения запроса должны быть:

+----+---------------------+-------+--------+----------+
| id | created             | user  | client | status   |
+----+---------------------+-------+--------+----------+
|  1 | 2019-05-06 00:00:00 | john  | Google | active   |
|  2 | 2019-05-06 00:00:00 | john  | Apple  | active   |
|  3 | 2019-05-06 00:00:00 | david | Amazon | inactive |
|  5 | 2019-05-07 00:00:00 | john  | Amazon | active   |
|  6 | 2019-05-07 00:00:00 | david | Google | active   |
|  7 | 2019-05-07 00:00:00 | john  | Apple  | active   |
|  8 | 2019-05-07 00:00:00 | david | Amazon | inactive |
+----+---------------------+-------+--------+----------+

Логика: В приведенном выше примере мы удаляем две повторяющиеся записи на основе дня, а не месяца и не года.

Что делает дублирующую запись: дублирующаяся запись - это когда две записи в один и тот же день имеют одинаковое значение для «клиента», «пользователь» и «статус».

В примере, Джон, 05-07-2019 дважды имеет Amazon в качестве клиента, но каждый имеет свой статус, поэтому мы не удаляем ни один иззаписи. Но у него также естьpple как клиент дважды, но оба статуса активны, это означает, что это дубликат, поэтому мы удаляем один из них.

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

Любая помощь будет оценена, потому что этосводит меня с ума!

Спасибо!

1 Ответ

0 голосов
/ 13 октября 2019

После того, как вы выяснили, как создавать операторы CREATE и INSERT, такого запроса должно быть достаточно:

SELECT MIN(id)id
     , client
     , status
     , user
     , created 
  FROM my_table 
 GROUP 
    BY client
     , status
     , user
     , created 
 ORDER 
    BY id;
...