MySQL запрос, чтобы получить одинаковые данные столбца в две строки - PullRequest
0 голосов
/ 27 января 2020

Я новичок в MySQL. У меня есть база данных, и я сталкиваюсь с проблемой получения данных в следующем формате.

Таблица как ниже

+----+------+-------+-+
| ID | ign  | time  | |
+----+------+-------+-+
|  1 | NULL | 12:30 | |
|  2 |    1 | 12:31 | |
|  3 | NULL | 12:32 | |
|  4 | NULL | 12:33 | |
|  5 | NULL | 12:34 | |
|  6 |    0 | 12:35 | |
|  7 | NULL | 12:36 | |
|  8 | NULL | 12:37 | |
|  9 |    1 | 12:38 | |
| 10 | NULL | 12:39 | |
| 11 | NULL | 12:40 | |
| 12 | NULL | 12:41 | |
| 13 |    0 | 12:42 | |
| 14 | NULL | 12:43 | |
| 15 | NULL | 12:44 | |
+----+------+-------+-+

Моя таблица Resultant должна иметь следующий формат.

Start | Start Time | Stop |Stop Time
1     | 12:31      | 0    | 12:35
1     | 12:38      | 0    | 12:42

Результат получается путем чередования 1 и 0 вместе. Первый рывок со значением 1 - это запуск, а второй рывок со значением 0 - это останов. Значение времени соответствующих 1 и 0 является временем начала и окончания. Я совершенно новичок в MySQL и не знаю, как этого достичь.

Ответы [ 2 ]

3 голосов
/ 27 января 2020

Вы можете сделать это с помощью коррелированного подзапроса:

select t.ign `Start`, t.time `Start Time`, 0 `Stop`,
  (select min(time) from tablename where ign = 0 and time > t.time) `Stop Time`
from tablename t 
where t.ign = 1

Для каждой строки, где ign = 1, подзапрос возвращает минимальное время позже, где ign = 0. Смотрите демо . Результаты:

| Start | Start Time | Stop | Stop Time |
| ----- | ---------- | ---- | --------- |
| 1     | 12:31      | 0    | 12:35     |
| 1     | 12:38      | 0    | 12:42     |
2 голосов
/ 27 января 2020

Это своего рода проблема пробелов и островков. Вы можете сделать сумму окна для определения групп: игнорируя ign s, которые равны null s, новая группа запускается каждый раз, когда встречается 1.

Для вашего набора данных следующий запрос будет получить ожидаемые результаты:

select 1 start, min(time) startTime, 0 stop, max(time) stopTime
from (
    select t.*, sum(ign) over(order by time) grp
    from mytable t
    where ign is not null
) t
group by grp

Обратите внимание, что оконные функции были добавлены в MySQL 8.0.

Демонстрация на DB Fiddle :

start | startTime | stop | stopTime
----: | :-------- | ---: | :-------
    1 | 12:31     |    0 | 12:35   
    1 | 12:38     |    0 | 12:42   
...