使用SQL计算时间序列中的时间间隔

Yur*_*kiy 2 mysql sql time datetime

我有一个像这样的 MySQL 表

CREATE TABLE IF NOT EXISTS `vals` (
  `DT` datetime NOT NULL,
  `value` INT(11) NOT NULL,
  PRIMARY KEY (`DT`)
);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

我需要得到这样的东西:

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
Run Code Online (Sandbox Code Playgroud)

我尝试了以下查询:

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
Run Code Online (Sandbox Code Playgroud)

但它在结果中返回许多行(29 而不是 9),我找不到任何方法来使用 SQL 来限制它。MySQL 中可以吗?

Ric*_*iwi 5

使用子查询

SELECT
  (
     select max(T1.DT)
     from vals T1
     where T1.DT < T2.DT
  ) AS `start`,
  T2.DT AS `stop`,
  T2.value AS value
FROM vals T2
ORDER BY T2.DT ASC
Run Code Online (Sandbox Code Playgroud)

您还可以使用使用变量的 MySQL 特定解决方案

SELECT CAST( @dt AS DATETIME ) AS `start` , @dt := DT AS `stop` , `value` 
FROM (SELECT @dt := NULL) dt, vals
ORDER BY dt ASC
Run Code Online (Sandbox Code Playgroud)

但你需要精确地做到这一点

  • ORDER by 必须存在,否则变量无法正确滚动
  • 该变量需要在查询中使用子查询来设置它,否则如果你连续运行两次,第二次它不会以NULL开头