Заполнение пробелов между отметкой времени начала и конца - PullRequest
1 голос
/ 03 февраля 2020

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

Дата выборки

    create table tbl(
      id int, value int, dateStart timestamp, dateEnd timestamp
    );

    insert into tbl values
    (1, 4, '2020-01-04 16:29:00', '2020-01-04 16:33:00'),
    (2, 3, '2020-01-04 18:29:00', '2020-01-04 18:33:00'),
    (3, 3, '2020-07-16 09:10:00', '2020-07-16 09:12:00');


| id  | value    | dateStart           | dateEnd             |
| --- | -------- | ------------------- | ------------------- |
| 1   | 4        | 2020-01-04 16:29:00 | 2020-01-04 16:33:00 |
| 2   | 3        | 2020-01-04 18:29:00 | 2020-01-04 18:30:00 |
| 3   | 3        | 2020-07-16 09:10:00 | 2020-07-16 09:12:00 |
| .   | .        | .                   | .                   |
| .   | .        | .                   | .                   |
| .   | .        | .                   | .                   |

Ожидаемый результат

| id  | value    | date                |
| --- | -------- | ------------------- | 
| 1   | 4        | 2020-01-04 16:29:00 |
| 2   | 4        | 2020-01-04 16:30:00 |
| 3   | 4        | 2020-01-04 16:31:00 |
| 4   | 4        | 2020-01-04 16:32:00 |
| 5   | 4        | 2020-01-04 16:33:00 |
| 6   | 3        | 2020-01-04 18:29:00 |
| 7   | 3        | 2020-01-04 18:30:00 |
| 8   | 3        | 2020-07-16 09:10:00 |
| 9   | 3        | 2020-07-16 09:11:00 |
| 10  | 3        | 2020-07-16 09:12:00 |

Я пока не очень знаком с CTE и курсорами. Любое предложение / помощь, как решить это лучше всего?

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Вот один (довольно неэффективный) способ сделать это - использовать рекурсивный запрос:

with recursive cte as (
    select id, value, dateStart, dateEnd from tbl
    union all
    select id, value, dateStart + interval 1 minute, dateEnd 
    from cte
    where dateStart < dateEnd
)
select row_number() over(order by id) id, value, dateStart date 
from cte
order by id

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

id | value | date               
-: | ----: | :------------------
 1 |     4 | 2020-01-04 16:29:00
 2 |     4 | 2020-01-04 16:30:00
 3 |     4 | 2020-01-04 16:31:00
 4 |     4 | 2020-01-04 16:32:00
 5 |     4 | 2020-01-04 16:33:00
 6 |     3 | 2020-01-04 18:29:00
 7 |     3 | 2020-01-04 18:30:00
 8 |     3 | 2020-07-16 09:10:00
 9 |     3 | 2020-07-16 09:11:00
10 |     3 | 2020-07-16 09:12:00
0 голосов
/ 10 февраля 2020

Гораздо эффективнее использовать псевдотаблицы MariaDB "seq":

( SELECT '2000-01-01' + INTERVAL seq DAY AS dy FROM seq_0_to_36524 )

сгенерирует даты столетия за 3 мс. Да, миллисекунды.

SELECT s.dy
    FROM ( SELECT '2020-01-04 18:29:00' + INTERVAL seq MINUTE AS dy
                                      FROM seq_0_to_1440 ) AS s
    WHERE s.dy <= '2020-01-04 18:33:00';

+---------------------+
| dy                  |
+---------------------+
| 2020-01-04 18:29:00 |
| 2020-01-04 18:30:00 |
| 2020-01-04 18:31:00 |
| 2020-01-04 18:32:00 |
| 2020-01-04 18:33:00 |
+---------------------+
5 rows in set (0.00 sec)

Создает сумму дат за день (в 1 мс), а затем ограничивает желаемый диапазон. В вашем случае вы бы LEFT JOIN перешли на ваш разреженный стол.

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