Здравствуйте! Прошу помощи в написании запроса, своей фантазии не хватает, гугл тоже на правильную мысль не натолкнул.
Есть следующая таблица:
CREATE TABLE `test` (
`ID` INT NOT NULL AUTO_INCREMENT,
`IdNameBlock` INT NULL,
`Param` TINYTEXT NULL,
`Value` FLOAT NULL,
`DateDB` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
Для примера заполним ее вот такими данными:
[syntax=mysql]INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (1, 'T1', 55.2, '2018-03-28 19:34:20');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (1, 'T2', 55.4, '2018-03-28 19:34:20');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (1, 'T3', 55.5, '2018-03-28 19:34:21');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (2, 'T1', 17.4, '2018-03-28 19:34:22');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (2, 'T2', 17.5, '2018-03-28 19:34:22');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (2, 'T3', 17.6, '2018-03-28 19:34:23');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (3, 'T1', 38.7, '2018-03-28 19:34:24');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (3, 'T2', 38.9, '2018-03-28 19:34:25');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (3, 'T3', 38.9, '2018-03-28 19:34:25');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (1, 'T1', 57.3, '2018-03-28 21:50:38');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (1, 'T2', 57.4, '2018-03-28 21:50:39');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (1, 'T3', 57.5, '2018-03-28 21:50:39');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (2, 'T1', 16.1, '2018-03-28 21:50:39');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (2, 'T2', 16.2, '2018-03-28 21:50:40');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (2, 'T3', 16.4, '2018-03-28 21:50:40');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (3, 'T1', 48.7, '2018-03-28 21:50:41');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (3, 'T2', 48.6, '2018-03-28 21:50:41');
INSERT INTO `boiler`.`test` (`IdNameBlock`, `Param`, `Value`, `DateDB`) VALUES (3, 'T3', 48.9, '2018-03-28 21:50:42');
[/syntax]
Задача получить значение Value от каждой записи IdNameBlock с разными Param (T1,T2,T3) и максимальной датой.
То есть результатом выборки должно быть:
ID|IdNameBlock|Param|Value| DateDB
10| 1 | T1 |57.3 |2018-03-28 21:50:38
11| 1 | T2 |57.4 |2018-03-28 21:50:39
12| 1 | T3 |57.5 |2018-03-28 21:50:39
13| 2 | T1 |16.1 |2018-03-28 21:50:39
14| 2 | T2 |16.2 |2018-03-28 21:50:40
15| 2 | T3 |16.4 |2018-03-28 21:50:40
16| 3 | T1 |48.7 |2018-03-28 21:50:41
17| 3 | T2 |48.6 |2018-03-28 21:50:41
18| 3 | T3 |48.9 |2018-03-28 21:50:42
Сделал следующий запрос:
SELECT s1.ID,s1.IdNameBlock, s1.Param, s1.Value, s1.DateDB
FROM test s1
JOIN (
SELECT IdNameBlock, MAX(DateDB) AS dateDB
FROM test
GROUP BY IdNameBlock
) AS s2 ON s1.IdNameBlock = s2.IdNameBlock AND s1.DateDB = s2.dateDB
ORDER BY s1.IdNameBlock ASC
И получаю такую выборку:
ID|IdNameBlock|Param|Value| DateDB
11| 1 | T2 |57.4 |2018-03-28 21:50:39
12| 1 | T3 |57.5 |2018-03-28 21:50:39
14| 2 | T2 |16.2 |2018-03-28 21:50:40
15| 2 | T3 |16.4 |2018-03-28 21:50:40
18| 3 | T3 |48.9 |2018-03-28 21:50:42
Часть данных отрезается, так как есть записи у которых дата не соответствует MAX (меньше на одну - две секунды).
Подскажите пожалуйста, как получить желаемый результат?