Выберите временную шкалу в базе данных MySQL - PullRequest
0 голосов
/ 21 января 2020

Это моя таблица MySQL.

+-----------+-------------+---------------------+
|   element | status      | hour                |
+-----------+-------------+---------------------+
|        18 | Available   | 2020-01-19 14:23:49 |
|        18 | Unavailable | 2019-09-13 18:19:47 |
|        18 | Available   | 2019-09-13 18:18:49 |
|        18 | Unavailable | 2019-09-09 08:22:45 |
|        19 | Available   | 2019-09-07 19:13:56 |
|        19 | Available   | 2019-09-03 18:13:49 |
+-----------+-------------+---------------------+

Обычно временная шкала строк в этой таблице MySQL для каждого элемента status недоступна / доступна.

Но это Случилось так, что для элемента номер 19 временная шкала строк в status доступна / доступна:

+----------+-------------+---------------------+
| element  | status      | hour                |
+----------+-------------+---------------------+
|       19 | Available   | 2019-09-07 19:13:56 |
|       19 | Available   | 2019-09-03 18:13:49 |
+----------+-------------+---------------------+

- это означает аномалию.

Мне нужно перехватить эти случаи, то есть все строки для каждого элемента status когда временная шкала доступна / доступна.

Как решить эту проблему?

Пожалуйста, вы можете мне помочь?

# Редактировать 01

+-----------+-------------+---------------------+---------+
|   element | status      | hour                |   ID    |
+-----------+-------------+---------------------+---------+
|        18 | Available   | 2020-01-19 14:23:49 |   6     |
|        18 | Unavailable | 2019-09-13 18:19:47 |   5     |
|        18 | Available   | 2019-09-13 18:18:49 |   4     |
|        18 | Unavailable | 2019-09-09 08:22:45 |   3     |
|        19 | Available   | 2019-09-07 19:13:56 |   2     |
|        19 | Available   | 2019-09-03 18:13:49 |   1     |
+-----------+-------------+---------------------+---------+

1 Ответ

1 голос
/ 21 января 2020

На основании ваших первоначально опубликованных образцов данных вы можете использовать подзапрос, чтобы посмотреть следующий и предыдущий статус, а затем проверить

select s.element,s.hour,s.`status`
from
(
select t.*,
(select concat(t1.status,',',t1.hour) from t t1 
where t1.element = t.element and t1.hour < t.hour
order by t1.element,t1.hour desc limit 1) prev,
(select concat(t1.status,',',t1.hour) from t t1 
where t1.element = t.element and t1.hour > t.hour
order by t1.element,t1.hour limit 1) nxt
from t
) s
where s.status = substring_index(s.nxt,',',1) or
        s.status = substring_index(s.prev,',',1)
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...