首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql中筛选行

在mysql中筛选行
EN

Stack Overflow用户
提问于 2018-10-10 20:05:25
回答 2查看 65关注 0票数 0

我正在试着在不发疯的情况下解决一个MySQL问题。不确定它是否可行。数据来自门/光传感器,以检测厕所是否有人使用。当门关闭或打开时,我会得到信息+灯光信息。如果我有关闭的门和light<10的信息,我说厕所没有被占用,如果light>10,厕所被占用,如果门是打开的,则厕所没有被占用。

以下是我的数据示例:

代码语言:javascript
复制
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

这个想法是在最后只有一系列从0到1的door_open,不可能有两个0或两个1连续。所以我需要保持light>10跟在door_open=1之后的第一个door_open=0,以及door_open=0之后的第一个door_open=1,不管是什么轻量值。

是否可以使用MySQL?我使用MariaDB 10.3.9。

谢谢你的点子。

输出应如下所示:

代码语言:javascript
复制
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

(我简化了时间,这在这里并不重要)这是一个fiddle

EN

回答 2

Stack Overflow用户

发布于 2018-10-10 20:44:37

这个查询应该可以执行您想要的操作。它使用MySQL变量将door_open的值延迟1行,然后返回其中door_open=0door_open=1之后的行,以及在door_open=0之后的第一个door_open=1,无论轻量值是什么:

代码语言:javascript
复制
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

输出(来自您的小提琴数据):

代码语言:javascript
复制
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

Updated SQLFiddle

票数 1
EN

Stack Overflow用户

发布于 2018-10-21 18:53:52

这是我的问题的潜在答案,工作之后的尼克解决方案。我不得不重新排序我的表(在删除行之后),以避免顺序混乱。

代码语言:javascript
复制
select es.id, 
   es.idNext,
   es.toilet_id,
   es.time,
   es.nextTime,
   timediff(es.nextTime, es.time) AS duration 
   from (
        SELECT id, toilet_id, time,
               @door_open := door_open as door_open,
               lead(id, 1) OVER(ORDER BY id) idNext,
               lead(time, 1) OVER(ORDER BY id) nextTime
               FROM events e
               JOIN (SELECT @door_open := 1) do
                  WHERE @door_open = 0 AND door_open = 1 OR
                  @door_open = 1 AND door_open = 0 AND light > 20
        ) es 
    where 
        es.door_open=0 and 
        timediff(es.nextTime, es.time)>5

下一步是更新查询,使用toilet_id上的分区将数据与每个id分开。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52739866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档