MySQL объединение группового максимума и диапазона

У меня есть следующие таблицы:

CREATE TABLE `data` (
  `date_time` decimal(26,6) NOT NULL,
  `channel_id` mediumint(8) unsigned NOT NULL,
  `value` varchar(40) DEFAULT NULL,
  `status` tinyint(3) unsigned DEFAULT NULL,
  `connected` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`channel_id`,`date_time`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `channels` (
  `channel_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `channel_name` varchar(40) NOT NULL,
  PRIMARY KEY (`channel_id`),
  UNIQUE KEY `channel_name` (`channel_name`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

Таблица каналов может содержать около ста или двухсот тысяч записей, а таблица данных может содержать миллионы. Таблица каналов, вероятно, останется довольно статичной. Таблица данных содержит изменения в значении для каждого канала. Я хотел бы иметь возможность вернуть все значения для каждого канала в данном наборе каналов между двумя временами t0 и t1. Для первого значения это будет значение самой последней записи до или равное t0 для каждого канала. Для остальных значений это просто те значения с временными метками> t0 и <= t1 для каждого канала. Если для данного канала нет времени <= t0, но есть время <= t1, я хотел бы вернуть строку с нулевыми значениями, например: channel_name t0 NULL NULL NULL. Запрос будет выглядеть примерно так, но с такими большими таблицами объединение будет невозможно медленным. Он также не возвращает строку NULL для отсутствующей строки t0.

SELECT channel_name, id, data.date_time, value, status, connected FROM
(SELECT channel_id, MAX(date_time) AS date_time, 't0' id
FROM data
WHERE date_time <= {T0}
GROUP BY channel_id
UNION
SELECT channel_id, date_time, 'delta_t' id
FROM data
WHERE date_time > {T0} AND date_time <= {T1}) x
INNER JOIN channels ON channels.channel_id = x.channel_id AND channel_name RLIKE '.*'
INNER JOIN data ON x.channel_id = data.channel_id AND x.date_time = data.date_time
ORDER BY channel_name, data.date_time

Большое спасибо за уделенное время.

0 ответов

Другие вопросы по тегам