mysql - 过滤mysql中的行
问题描述
我正在尝试解决 MySQL 问题而不会发疯。不确定是否可行。数据来自门/光传感器,以检测厕所是否被占用。当门关闭或打开时,我得到信息+灯光信息。如果我有关门和灯<10的信息,我说厕所没有被占用,如果灯>10,厕所被占用,如果门打开,厕所未被占用。
这是我的数据示例:
id wc_id door_open light time
138 0 1 64 2018-10-10 12:28:51
139 0 0 58 2018-10-10 12:34:00
140 0 0 54 2018-10-10 12:34:38
141 0 1 68 2018-10-10 12:35:11
142 0 1 3 2018-10-10 12:35:36
143 0 0 60 2018-10-10 12:37:56
144 0 0 60 2018-10-10 12:37:57
145 0 0 57 2018-10-10 12:38:30
146 0 1 65 2018-10-10 12:43:53
147 0 1 3 2018-10-10 12:44:17
148 0 0 63 2018-10-10 13:10:55
149 0 0 59 2018-10-10 13:11:16
150 0 1 71 2018-10-10 13:12:09
151 0 1 4 2018-10-10 13:12:14
152 0 1 1 2018-10-10 13:15:07
153 0 0 62 2018-10-10 13:17:18
154 0 0 58 2018-10-10 13:18:01
155 0 1 68 2018-10-10 13:19:20
156 0 1 3 2018-10-10 13:19:56
157 0 1 42 2018-10-10 13:26:41
158 0 0 63 2018-10-10 13:26:44
159 0 0 58 2018-10-10 13:27:39
160 0 1 71 2018-10-10 13:27:40
161 0 1 3 2018-10-10 13:28:37
最后的想法是只有一系列的 door_open 到 0 到 1,不可能有两个 0 或两个 1 连续。所以我需要首先door_open=0
遵循light>10
a door_open=1
,然后首先遵循door_open=1
,door_open=0
无论是什么光值。
MySQL可以吗?我使用 MariaDB 10.3.9。
谢谢你的想法。
输出应该是这样的:
id wc_id door_open light time
139 0 0 58 12:34:00
141 0 1 68 12:35:11
143 0 0 60 12:37:56
146 0 1 65 12:43:53
148 0 0 63 13:10:55
150 0 1 71 13:12:09
153 0 0 62 13:17:18
155 0 1 68 13:19:20
158 0 0 63 13:26:44
160 0 1 71 13:27:40
(我简化了时间,这里并不重要)这是一个小提琴
解决方案
这个查询应该做你想做的事。它使用一个 MySQL 变量将 的值延迟door_open
1 行,然后返回door_open=0
带有light>10
跟随 adoor_open=1
和 first door_open=1
after的行door_open=0
,无论轻值:
SELECT events.*, @door_open := door_open
FROM events
JOIN (SELECT @door_open := 1) do
WHERE @door_open = 0 AND door_open = 1 OR
@door_open = 1 AND door_open = 0 AND light > 10
输出(来自您的小提琴数据):
id toilet_id door_open light time @door_open := door_open
101 0 false 62 2018-10-10T11:39:31Z 0
103 0 true 69 2018-10-10T11:39:34Z 1
104 0 false 62 2018-10-10T11:42:16Z 0
106 0 true 68 2018-10-10T11:45:50Z 1
109 0 false 56 2018-10-10T12:13:11Z 0