【发布时间】:2018-11-19 16:05:47
【问题描述】:
我需要删除历史日志数据中的冗余。所以给出下表:
--------------------------------------
| 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的行的选择
【问题讨论】:
-
为什么排除
1 | 'A' | 2018-01-03和1 | 'A' | 2018-01-05而保留1 | 'A' | 2018-01-02? -
因为
(1, 'B', 2018-01-02)已经发生了。基本上,对于实体1,日志中的连续操作是A->A->B->A->A->A->B,我想要一个返回带有这些操作A->B->A->B的行的选择。我可能会将其添加到编辑中 -
在您想要的样本中,您有
A>B>A>A>B -
第四行属于实体
8。我包括8以表明日志由不同的实体组成。其他实体的后续行动也应该被忽略。 -
您没有 PRIMARY KEY,这使得此类问题基本上无法解决(或至少毫无意义)。
标签: mysql sql logging data-cleaning redundancy