Как найти время пересечения нескольких периодов времени? - PullRequest
0 голосов
/ 12 июня 2019

Как мы можем найти время пересечения несколько раз в MySQL?У меня есть эта таблица:

Ввод:

id | circuit_id |  downtime       |  uptime         | duration | Location
---+------------+-----------------+-----------------+----------+----------
 1 |      1     | 6/12/2019 11:22 | 6/12/2019 11:27 |  0:05:00 | Bhopal
 2 |      2     | 6/12/2019 04:55 | 6/12/2019 07:19 |  2:24:00 | Bhopal
 3 |      3     | 6/04/2019 17:59 | 6/06/2019 18:57 | 48:58:00 | Bhopal
 4 |      4     | 6/02/2019 03:06 | 6/02/2019 03:12 |  0:06:00 | Bhopal
 5 |      1     | 6/01/2019 19:49 | 6/01/2019 20:00 |  0:11:00 | Bhopal
 6 |      2     | 5/24/2019 14:59 | 5/24/2019 15:03 |  0:04:00 | Bhopal
 7 |      3     | 5/19/2019 03:15 | 5/19/2019 03:54 |  0:39:00 | Bhopal
 8 |      4     | 5/15/2019 19:47 | 5/15/2019 19:50 |  0:03:00 | Bhopal
 9 |      1     | 5/10/2019 01:21 | 5/10/2019 03:52 |  0:31:00 | Bhopal
10 |      2     | 5/10/2019 02:55 | 5/10/2019 03:37 |  2:42:00 | Bhopal
11 |      3     | 5/10/2019 03:18 | 5/10/2019 04:37 |  1:19:00 | Bhopal
12 |      4     | 5/10/2019 03:20 | 5/10/2019 03:30 |  1:25:00 | Bhopal
13 |      1     | 5/09/2019 05:06 | 5/09/2019 14:17 |  9:11:00 | Bhopal
14 |      2     | 5/09/2019 04:31 | 5/09/2019 04:34 |  0:03:00 | Bhopal
15 |      3     | 4/17/2019 18:37 | 4/17/2019 18:44 |  0:07:00 | Bhopal
16 |      6     | 4/17/2019 17:23 | 4/17/2019 18:05 |  0:42:00 | Delhi
17 |      7     | 4/17/2019 17:00 | 4/17/2019 17:05 |  0:05:00 | Delhi
18 |      8     | 4/10/2019 06:16 | 4/10/2019 06:22 |  0:06:00 | Delhi
19 |      9     | 4/10/2019 02:20 | 4/10/2019 02:45 |  0:25:00 | Delhi
20 |      6     | 4/08/2019 23:01 | 4/08/2019 23:05 |  0:04:00 | Delhi
21 |      7     | 4/05/2019 11:20 | 4/05/2019 11:27 |  0:07:00 | Delhi
22 |      8     | 4/04/2019 01:16 | 4/04/2019 01:27 |  0:11:00 | Delhi
23 |      9     | 4/02/2019 16:30 | 4/02/2019 16:31 |  0:01:00 | Delhi

Как проверить по дате и по местоположению, что совпадение времен?Если все цепи не работают в течение одного промежутка времени, то обрабатывайте их как вниз, а в противном случае как вверх.Мне нужны только данные о простоях.

Ожидаемый выход:

Бхопал 05/10/2019 не работает в течение десяти минут 00:10, так как все четыре цепи не работают с 03:20 до 03:30 в этот конкретный день.

Location | downtime | date
---------+----------+-----------
Bhopal   |  00:10   | 2019-05-10

1 Ответ

0 голосов
/ 12 июня 2019

Вы можете использовать самосоединение для сопоставления перекрытий и предложение having для фильтрации тех, которые содержат все ссылки.

Чтобы получить общее количество цепей, вы можете выполнить еще одно самостоятельное объединение, чтобы найти все схемы, которые когда-либо появлялись в таблице, для каждого местоположения:

select     a.location, 
           num_circuits, 
           a.downtime, 
           min(b.uptime) uptime, 
           timediff(min(b.uptime), a.downtime) duration, 
           count(distinct b.circuit_id) num_circuits_down
from       tbl a
inner join tbl b 
        on a.location = b.location
       and a.downtime between b.downtime and b.uptime
inner join (
            select   location, count(distinct circuit_id) num_circuits
            from     tbl
            group by location
           ) c
        on a.location = c.location
group by   a.location, num_circuits, a.downtime
having     count(distinct b.circuit_id) = num_circuits;

Было бы лучше иметь отдельную справочную таблицу, в которой перечислены цепи для каждого местоположения (4 записи на местоположение в вашем случае). Тогда вышеуказанный запрос будет выбран из этой справочной таблицы, вместо:

            select   location, count(distinct circuit_id) num_circuits
            from     tbl
            group by location

... вы бы сделали:

            select   location, count(distinct circuit_id) num_circuits
            from     reftable
            group by location

Это сделает вышеупомянутый запрос более эффективным и надежным.

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