这从 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 |
+----+---------------------+-------+--------+----------+
逻辑: 在上面的示例中,我们根据日而不是月和年删除两个重复记录。
重复记录的构成因素: 重复记录是指同一天的两条记录具有相同的"客户端"、"用户"和"状态"值。
在此示例中,John 在 2019 年 5 月 7 日将亚马逊作为客户端两次,但每次都有不同的状态,因此我们不会删除任何记录。但他也有两次苹果作为客户,但两个状态都是活跃的,这意味着它是一个重复的,所以我们删除了其中一个。
不确定我是否说清楚,但我的最后一次尝试是简单地说,每天,我们删除在客户端、状态和用户中具有相同值的记录,如果这三者中的任何一个不相同,那么它不是重复的,所以我们保留两个记录。
任何帮助将不胜感激,因为这让我发疯!
谢谢!
一旦你弄清楚了如何构造 CREATE 和 INSERT 语句,像这样的查询就足够了:
SELECT MIN(id)id
, client
, status
, user
, created
FROM my_table
GROUP
BY client
, status
, user
, created
ORDER
BY id;