根据某天的两列从 MySQL 数据库中删除每日重复项

Remove daily duplicates from MySQL DB based on two columns in a certain period of days

这两天以来一直困扰着我,我无法理解它。

我有一个 MySQL table 具有以下结构:

 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 |
+----+---------------------+-------+--------+----------+

逻辑: 在上面的示例中,我们根据日而不是月而不是年删除了两条重复记录。

重复记录的原因: 重复记录是指同一天的两条记录具有相同的 "client"、"user" 和 "status".

在示例中,John 在 05-07-2019 两次成为 Amazon 的客户,但每次都有不同的状态,因此我们不会删除任何记录。但他也有 Apple 作为客户两次,但两次状态都是 Active,这意味着它是重复的,所以我们删除其中一个。

不确定我是否说清楚了,但我最后的尝试是简单地说,每天,我们删除在客户端、状态和用户中具有相同值的记录,如果这三个中的任何一个是不相同那么它就不是重复的,所以我们保留这两个记录。

任何帮助将不胜感激,因为这让我发疯!

谢谢!

一旦您了解了如何构建 CREATE 和 INSERT 语句,像这样的查询就足够了:

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