根据某天的两列从 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;
这两天以来一直困扰着我,我无法理解它。
我有一个 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;