Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток. Не даёт покоя простая для понимания задача. Имеется таблица (показания прибора):
CREATE TABLE `test_grp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`val` float NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO `test_grp` VALUES (1,'2011-12-31 20:01:00',0.08),(2,'2011-12-31 20:02:00',1.12),(3,'2011-12-31 20:03:00',2.34),(4,'2011-12-31 20:04:00',4.29),(5,'2011-12-31 20:05:00',7.67),(6,'2011-12-31 20:06:00',3.41),(7,'2011-12-31 20:07:00',2.15),(8,'2011-12-31 20:08:00',1.23),(9,'2011-12-31 20:09:00',8.79),(10,'2011-12-31 21:00:00',2.54),(11,'2011-12-31 21:02:00',1.36),(12,'2011-12-31 21:03:00',0.15),(13,'2011-12-31 21:12:03',15.81),(14,'2011-12-31 21:13:31',20.37),(15,'2011-12-31 21:13:48',16.72),(16,'2011-12-31 21:13:57',10.21),(17,'2011-12-31 21:14:23',1.89),(18,'2011-12-31 21:14:39',0.97),(19,'2011-12-31 21:15:29',0.31);
Выглядит так:
| id | time | val |
+---+---------------------+------+
| 1 | 2012-01-01 00:01:00 | 0.08 |
| 2 | 2012-01-01 00:02:00 | 1.12 |
| 3 | 2012-01-01 00:03:00 | 2.34 |
| 4 | 2012-01-01 00:04:00 | 4.29 |
| 5 | 2012-01-01 00:05:00 | 7.67 |
| 6 | 2012-01-01 00:06:00 | 3.41 |
| 7 | 2012-01-01 00:07:00 | 2.15 |
| 8 | 2012-01-01 00:08:00 | 1.23 |
| 9 | 2012-01-01 00:09:00 | 8.79 |
| 10 | 2012-01-01 01:00:00 | 2.54 |
| 11 | 2012-01-01 01:02:00 | 1.36 |
| 12 | 2012-01-01 01:03:00 | 0.15 |
| 13 | 2012-01-01 01:12:03 | 15.81 |
| 14 | 2012-01-01 01:13:31 | 20.37 |
| 15 | 2012-01-01 01:13:48 | 16.72 |
| 16 | 2012-01-01 01:13:57 | 10.21 |
| 17 | 2012-01-01 01:14:23 | 1.89 |
| 18 | 2012-01-01 01:14:39 | 0.97 |
| 19 | 2012-01-01 01:15:29 | 0.31 |
+----+---------------------+-------+
Нужно выделить группы "превышений" показаний прибора, например выше 3.0, о которых человекопонимаемым языком говорят так:
"превышение №1, началось '2012-01-01 00:04:00', закончилось '2012-01-01 00:06:00', достигнут максимум 7.67"
"превышение №3, началось '2012-01-01 01:12:03', закончилось '2012-01-01 01:13:57', достигнут максимум 20.37"
Пробую так
Отредактированно Placeholder (22.03.2012 13:43:35)
Неактивен
Хорошего способа я не знаю. Можно идти по таблице по возрастанию времени и с помощью пользовательских переменных для превышений устанавливать целочисленное значение равное номеру превышения. Потом группировать по этому полю.
http://webew.ru/articles/3923.webew
http://sqlinfo.ru/forum/viewtopic.php?id=1742&p=1 (читать всю тему до конца)
Неактивен
Вложенный подзапрос (см примеры во второй ссылке), т.е. промежуточный результат сохраняется во временной таблице, по которой уже идет группировка.
Неактивен
Стало немного стыдно за предыдущий пост, но Вы всё же успели на него ответить
Начал с подзапроса:
Отредактированно Placeholder (22.03.2012 13:38:31)
Неактивен
Неактивен
Вот итоговый запрос:
Отредактированно Placeholder (22.03.2012 14:05:06)
Неактивен
Однако, мой вариант гарантирует, что упорядочен по времени будет только результат подзапроса. В Вашем варианте используется дополнительный подзапрос, выстраивающий данные в хронологическом порядке. Действительно, чтобы не инсертить данные каждую секунду, для устройств предусмотрен буфер, по накоплению которого происходит сброс в базу, вполне вероятно, что последовательные `id` будут иметь не последовательные показание времени. Моё упущение.
Неактивен