我有一个保存事件数据的表。结构如下
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.事件和会话的顺序由时间和顺序决定。
在每个会话中,都有很多事件EventStart
,EventEnd
。理想情况下,我们希望它们按以下顺序发生:
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
我希望能够以正确的顺序收集多个会话。是否可以使用单个查询?
答案 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。