Фильтр строк в MySQL - PullRequest
       4

Фильтр строк в MySQL

0 голосов
/ 10 октября 2018

Я пытаюсь решить проблему 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 после 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

(я упростил время, это не очень важновот) Вот такая скрипка

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вот потенциальный ответ на мою проблему, после работы над решением Ника.Мне пришлось изменить порядок моей таблицы (после удаления строк), чтобы избежать беспорядка заказа.

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 для отделения данных от каждого идентификатора.

0 голосов
/ 10 октября 2018

Этот запрос должен делать то, что вы хотите.Он использует переменную MySQL для задержки значения door_open на 1 строку, а затем возвращает строки, где door_open=0 с light>10 после door_open=1 и сначала door_open=1 после 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

Обновлен SQLFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...