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. 事件和会话的顺序由时间和顺序决定。
每一届都有很多活动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
我希望能够以正确的顺序收集多个会话。这可能使用单个查询吗?
解决方案
这被证明是一个仅使用 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。
推荐阅读
- python - 如何导出特定谷歌驱动器文件夹中的数据?
- ms-access - 可以创建带有格式属性集的表(SQL 查询)字段吗?
- javascript - 使用 knex update 调用 javascript 函数来更新列值
- java - 从抽象类继承的派生类中找不到方法
- python - Python - 检查列表成员资格并将父组名称存储在列/多个 lambda 语句中?
- kotlin - 文件上传导致 HTTP 415 Unsupported Media Type with RouterFunction 和 HandlerFunction
- r - 如何在 r(基本)中更改热图中的标题和标签的颜色?
- java - Kafka 问题 WARN [Producer clientId=console-producer] 连接到节点时出错.......java.net.UnknownHostException
- android - Android Emulator 给出关于 vulkan-1.dll 未找到的错误
- javascript - 为什么 React 在每次页面更改(使用路由)时都会渲染所有页面(菜单、标题等)?