maraidb заполнить пропущенный час, минутный интервал - PullRequest
0 голосов
/ 01 мая 2019

У меня есть таблица MariaDB со следующей схемой:

+-------------------+---------------------+------+-----+---------+-------+
| Field             | Type                | Null | Key | Default | Extra |
+-------------------+---------------------+------+-----+---------+-------+
| id                | int(10) unsigned    | NO   | PRI | 0       |       |
| date              | date                | NO   | PRI | NULL    |       |
| HE                | tinyint(3) unsigned | NO   | PRI | 0       |       |
| minute            | tinyint(3) unsigned | NO   | PRI | 0       |       |
| price             | float               | NO   |     | NULL    |       |
+-------------------+---------------------+------+-----+---------+-------+

Таблица содержит цены с пятиминутными интервалами (часы 1-24 и минуты 0-55).Интервалы без цен не имеют строк.Я пытаюсь написать запрос, чтобы заполнить пропущенные интервалы со значениями нуля, не просто записывая строки с этой информацией.

Я попытался использовать подзапрос со всеми 24-часовыми и 5-минутными интервалами и присоединиться к нему.в столбцы он и минуты безуспешно.

Код, который я пробовал ниже.Подзапрос правильно возвращает часы 1-24 и 5-минутные интервалы 0-55, но окончательный результат включает только строки, заполненные в таблице цен, а не полный временной ряд.Я думал, что правое соединение должно сделать это, но я также попытался внутреннее соединение, левое соединение и присоединиться без успеха.

select B.id, B.date, A.he, A.minute, B.price 
from price B 
right join (select distinct he, minute from price where id = 4093739409 and minute % 5 = 0 order by he,minute) as A 
on B.he = A.he and B.minute = A.minute 
where B.date = '2019-04-18' and B.id = 4093739409;

1 Ответ

1 голос
/ 01 мая 2019

Вместо внешнего объединения со списком часов и минут из данных , составьте список из всех комбинаций часов-минут и внешнее соединение:

SELECT x1.he, x2.minute, price.*
FROM (
    SELECT 01 AS he UNION ALL
    SELECT 02 UNION ALL
    ...
    SELECT 24
) AS x1
CROSS JOIN (
    SELECT 00 AS minute UNION ALL
    SELECT 05 UNION ALL
    ...
    SELECT 55
) AS x2
LEFT JOIN price ON x1.he = price.he AND x2.minute = price.minute AND price.date = '2019-04-18' AND price.id = 4093739409
ORDER BY x1.he, x2.minute

В MariaDB вы можете использовать конструктор значений строк, например (VALUES (01), (02), ..., (24)) AS x1(he).

...