首页 > 解决方案 > 忽略mysql select中的后续等效行

问题描述

我需要删除历史日志数据中的冗余。所以给出下表:

 --------------------------------------
|  entity_id  |  action  |   date      |
 --------------------------------------
|      1      |    'A'   | 2018-01-01  |
|x     1      |    'A'   | 2018-01-01  |
|      1      |    'B'   | 2018-01-01  |
|      1      |    'A'   | 2018-01-02  |
|      8      |    'A'   | 2018-01-02  |
|x     1      |    'A'   | 2018-01-03  |
|x     8      |    'A'   | 2018-01-04  |
|x     1      |    'A'   | 2018-01-05  |
|      1      |    'B'   | 2018-01-05  |
 --------------------------------------

我想删除带有(x)的那些。简而言之,我想忽略实体随后采取的任何具有相同操作的行。因此,我想要一个返回以下结果的查询

 --------------------------------------
|  entity_id  |  action  |   date      |
 --------------------------------------
|      1      |    'A'   | 2018-01-01  |
|      1      |    'B'   | 2018-01-01  |
|      1      |    'A'   | 2018-01-02  |
|      8      |    'A'   | 2018-01-02  |
|      1      |    'B'   | 2018-01-05  |
 --------------------------------------

以编程方式,删除这些冗余很容易,但是对于纯 SQL,我有点迷茫。对 SQL 查询足够了解的人将如何处理这个问题?

谢谢

编辑:基本上,对于实体 1,日志中的连续操作是A->A->B->A->A->A->B,我想要一个返回具有这些操作的行的选择A->B->A->B

标签: mysqlsqlloggingdata-cleaningredundancy

解决方案


这将是如果按日期顺序添加行。

select entity_id, action, min(date)
from table
group by entity id, action

推荐阅读