MySQL объединение группового максимума и диапазона - PullRequest
0 голосов
/ 25 марта 2011

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

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. </p>

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

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

...