考虑以下...
数据集...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
( dt datetime NOT NULL PRIMARY KEY
, temp DECIMAL(5,2) NOT NULL);
INSERT INTO my_table VALUES
('2014-11-14 7:21:31', -2.4),
('2014-11-14 7:22:31', -2.4),
('2014-11-15 5:03:31', 2.4),
('2014-11-15 5:04:31', 2.4),
('2014-11-16 5:10:31', -0.2),
('2014-11-16 5:11:31', -0.2),
('2014-11-17 5:13:31', -0.2),
('2014-11-17 5:14:31', -0.2),
('2014-11-18 5:15:31', 2),
('2014-11-18 5:16:31', 2);
解决方案 1 - 如果您只想知道最长运行的长度...
SELECT MAX(@count := IF(a.result = b.result, @count + 1, 1)) LongestRun
FROM
( SELECT DISTINCT DATE(x.dt) date
, COALESCE(y.temp,x.temp) < 0 result
FROM my_table x
LEFT
JOIN my_table y
ON DATE(y.dt) = DATE(x.dt) AND y.temp < 0
) a
CROSS
JOIN (SELECT @count := 0) vars
LEFT
JOIN
( SELECT DISTINCT DATE(x.dt) date
, COALESCE(y.temp,x.temp) < 0 result
FROM my_table x
LEFT
JOIN my_table y
ON DATE(y.dt) = DATE(x.dt) AND y.temp < 0
) b
ON b.date = a.date - INTERVAL 1 DAY
WHERE a.result = 1;
+------------+
| LongestRun |
+------------+
| 2 |
+------------+
解决方案 2 - 如果您还想要一些其他信息
SELECT a.date start
, MIN(c.date) end
, DATEDIFF(MIN(c.date),a.date) + 1 LongestRun
FROM
( SELECT DISTINCT DATE(x.dt) date
, COALESCE(y.temp,x.temp) < 0 result
FROM my_table x
LEFT
JOIN my_table y
ON DATE(y.dt) = DATE(x.dt) AND y.temp < 0
) a
LEFT
JOIN
( SELECT DISTINCT DATE(x.dt) date
, COALESCE(y.temp,x.temp) < 0 result
FROM my_table x
LEFT
JOIN my_table y
ON DATE(y.dt) = DATE(x.dt) AND y.temp < 0
) b
ON b.date = a.date - INTERVAL 1 DAY
AND b.result = 1
LEFT
JOIN
( SELECT DISTINCT DATE(x.dt) date
, COALESCE(y.temp,x.temp) < 0 result
FROM my_table x
LEFT
JOIN my_table y
ON DATE(y.dt) = DATE(x.dt) AND y.temp < 0
) c
ON c.date >= a.date
AND c.result = 1
LEFT
JOIN
( SELECT DISTINCT DATE(x.dt) date
, COALESCE(y.temp,x.temp) < 0 result
FROM my_table x
LEFT
JOIN my_table y
ON DATE(y.dt) = DATE(x.dt) AND y.temp < 0
) d
ON d.date = c.date + INTERVAL 1 DAY
AND d.result = 1
WHERE a.result = 1
AND b.date IS NULL
AND c.date IS NOT NULL
AND d.date IS NULL
GROUP
BY a.date
ORDER
BY LongestRun DESC
LIMIT 1;
+------------+------------+------------+
| start | end | LongestRun |
+------------+------------+------------+
| 2014-11-16 | 2014-11-17 | 2 |
+------------+------------+------------+
对于聚合数据,只需发出单独的查询。