订购事件数据

时间:2018-11-21 10:58:34

标签: mysql

我有一个保存事件数据的表。结构如下

CREATE TABLE t1 (`id` int, 
                 `start` datetime, 
                 `end` datetime default null, 
                 `evt` varchar(20), 
                 `sequence` int);

但是事实证明,每次数据输入顺序都不正确。 正确的顺序由以下规则决定:  1.每个事件都属于一个会话。您不能在SessionStart,SessionEnd之外拥有EventStart,EventEnd。  2.每个会话都以SessionStart开始,以SessionEnd结尾。  3. EventStart不能晚于EventEnd出现。  4. xStart,xEnd使用开始时间进行匹配  5.事件和会话的顺序由时间和顺序决定。

在每个会话中,都有很多事件EventStartEventEnd。理想情况下,我们希望它们按以下顺序发生:

 1. SessionStart - 12 - 2018-02-10 15:50:00
 2. EventStart   -  0 - 2018-02-10 15:51:00
 3. EventEnd     -  2 - 2018-02-10 15:51:00 - 2018-02-10 15:52:00
 4. EventStart   -  0 - 2018-02-10 15:52:00
 5. EventEnd     -  3 - 2018-02-10 15:52:00 - 2018-02-10 15:53:00
 6. SessionEnd   - 13 - 2018-02-10 15:50:00 - 2018-02-10 15:55:00

但是如果我得到类似以下的内容怎么办

 1. EventStart   -  0 - 2018-02-10 15:51:00
 2. EventEnd     -  2 - 2018-02-10 15:51:00 - 2018-02-10 15:52:00
 3. EventStart   -  0 - 2018-02-10 15:52:00
 4. EventEnd     -  3 - 2018-02-10 15:52:00 - 2018-02-10 15:53:00
 5. SessionEnd   - 12 - 2018-02-10 15:50:00 - 2018-02-10 15:55:00
 6. SessionStart - 11 - 2018-02-10 15:50:00

我希望能够以正确的顺序收集多个会话。是否可以使用单个查询?

https://www.db-fiddle.com/f/ipLSGJd5Pqzy1VBGXKx9Mv/2

1 个答案:

答案 0 :(得分:0)

这被证明是仅使用SQL即可解决的一个难题,而我最终做了很多更改。

我要做的是添加另一个名为sessionId的列。

CREATE TABLE t1 (`id` int, 
                 `start` datetime, 
                 `end` datetime default null, 
                 `sessionId` int,
                 `evt` varchar(20), 
                 `sequence` int);

此列由后台工作人员填充,并为会话期内的每个事件分配相同的sessionId。

然后我可以使用以下内容

SELECT * FROM t1 WHERE evt = 'SessionStart' AND sessionId = 1
UNION
SELECT * FROM t1 WHERE evt in('EventStart', 'EventEnd') AND sessionId = 1
UNION
SELECT * FROM t1 WHERE evt = 'SessionEnd' AND sessionId = 1

这可以进一步简化,因为生成事件的新型设备还将包括每个事件的事件生成时间戳和sessionId。