我有一个MySQL表像这样时间间隔计算在时间序列上使用SQL
CREATE TABLE IF NOT EXISTS `vals` (
`DT` datetime NOT NULL,
`value` INT(11) NOT NULL,
PRIMARY KEY (`DT`)
);
的DT是唯一的日期与时间
数据样本:
INSERT INTO `vals` (`DT`,`value`) VALUES
('2011-02-05 06:05:00', 300),
('2011-02-05 11:05:00', 250),
('2011-02-05 14:35:00', 145),
('2011-02-05 16:45:00', 100),
('2011-02-05 18:50:00', 125),
('2011-02-05 19:25:00', 100),
('2011-02-05 21:10:00', 125),
('2011-02-06 00:30:00', 150);
我需要得到像这样:
start|end|value
NULL,'2011-02-05 06:05:00',300
'2011-02-05 06:05:00','2011-02-05 11:05:00',250
'2011-02-05 11:05:00','2011-02-05 14:35:00',145
'2011-02-05 14:35:00','2011-02-05 16:45:00',100
'2011-02-05 16:45:00','2011-02-05 18:50:00',125
'2011-02-05 18:50:00','2011-02-05 19:25:00',100
'2011-02-05 19:25:00','2011-02-05 21:10:00',125
'2011-02-05 21:10:00','2011-02-06 00:30:00',150
'2011-02-06 00:30:00',NULL,NULL
我想下面的查询:
SELECT T1.DT AS `start`,T2.DT AS `stop`, T2.value AS value FROM (
SELECT DT FROM vals
) T1
LEFT JOIN (
SELECT DT,value FROM vals
) T2
ON T2.DT > T1.DT ORDER BY T1.DT ASC
但它返回到许多行(29,而不是9)的结果,我冷没有找到任何方式来限制这种使用SQL。在MySQL中可能吗?有两种不同的
select @myvar as start, end, value, @myvar := end as next_rows_start
from vals
变量从序列左右的解释,所以两个引用@myvar(启动和next_rows_start)将输出:
的“纯SQL”版本的作品,但(尽管我努力,分析和索引)似乎为O运行(N^2) 。给定一个18,000行表,纯SQL版本需要约580秒,具有变量的MySQL特定版本需要约2.5秒。感谢您提供两个版本。 – 2013-12-23 14:08:17