Получить максимальное значение из одной таблицы с отметкой времени плюс 3 секунды для периода времени из другой таблицы - PullRequest
1 голос
/ 01 июля 2019

Мне нужно отобразить EndTime со значением TimeStr, когда значение таблицы hopper2_setpoint_met равно 1, и мне нужно отобразить Weight как MAX(Value) из таблицы hopper2_liveweight из TimeStr +3 second, начинающееся со значения TimeStr, когда заданное значение таблицы соответствует 1.

Пример желаемого результата

+---------------------+--------+
|       EndTime       | Weight | 
+---------------------+--------+
| 2019-06-30 12:02:33 |   300  |
| 2019-06-30 12:04:45 |   299  | 
+---------------------+--------+

enter image description here


Данные и мои попытки

Вы можете получить доступ к этим данным из этого SQLFiddle поста, где я построил схему и вставил небольшое подмножество данных, или, если вы хотите создать с ней собственные таблицы базы данных MySQL, тогда вот SQL и для этого.

CREATE TABLE `hopper2_setpoint_met` (
  `TimeStr` datetime NOT NULL,
  `Value` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `hopper2_setpoint_met` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:02:33',1);
INSERT INTO `hopper2_setpoint_met` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:03:51',0);
INSERT INTO `hopper2_setpoint_met` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:45',1);
INSERT INTO `hopper2_setpoint_met` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:05:56',0);
INSERT INTO `hopper2_setpoint_met` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:49',1);

CREATE TABLE `hopper2_liveweight` (
  `TimeStr` datetime NOT NULL,
  `Value` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:02:33',292);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:02:34',298);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:02:35',300);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:02:36',300);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:14',106);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:15',111);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:16',116);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:17',123);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:19',132);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:20',142);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:21',148);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:22',154);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:23',160);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:24',166);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:25',172);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:26',177);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:27',184);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:29',190);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:30',195);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:31',201);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:32',208);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:33',213);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:34',220);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:35',226);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:36',232);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:37',239);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:38',244);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:39',251);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:40',257);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:41',263);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:42',269);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:43',276);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:44',282);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:45',288);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:46',293);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:47',299);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:04:48',299);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:18',108);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:19',112);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:20',117);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:21',123);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:22',128);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:23',135);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:24',141);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:25',148);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:26',154);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:27',160);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:28',165);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:29',172);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:30',177);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:31',183);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:32',190);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:33',196);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:34',201);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:35',208);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:36',213);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:37',220);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:38',226);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:39',231);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:40',237);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:41',242);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:42',248);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:43',254);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:44',262);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:45',269);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:46',276);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:47',282);
INSERT INTO `hopper2_liveweight` (`TimeStr`,`Value`) VALUES ('2019-06-30 12:06:49',288);

Я опубликовал MySQL для выбора максимального значения между отметками времени включения и выключения плюс 3 секунды вчера о чем-то похожем для транспортера, но я узнал, что использование временной таблицы было не лучшим решением, хотя ответ, который я получил там, дал мне ожидаемый результат, о котором я просил.

Я также узнал несколько вещей из полученных ответов и попробовал несколько вариантов этих вещей, например трюк If(CAST(Value AS UNSIGNED) != 0, Value, Null) Weight и несколько других вещей, для своего нового задания, и снова у меня возникают проблемы с получением ожидаемых результатов.

Я, конечно, могу получить ожидаемые результаты, если поместить данные во временную таблицу, но они не работают должным образом, и я считаю, что это слишком усложняет процесс и не является действительно необходимым.

Я попробовал несколько разных вариантов, используя операторы JOIN и данные UNION вместе с подзапросами, и потерпел неудачу, когда попытался получить максимальный вес между записями timestr + 3 секунды.

Я бы с удовольствием узнал что-то новое, и в моей голове погасла лампочка от ответа, который помогает решить эту проблему, поэтому нужно применять аналогичную логику без необходимости создавать временные или постоянные временные таблицы.

Хранение всего этого в запросе с некоторыми JOIN операторами или даже несколькими подзапросами, если необходимо, будет работать для меня. Я не был уверен, поможет ли использование переменных сеанса MySQL, но я даже попробовал несколько вещей с этим и потерпел неудачу.

1 Ответ

1 голос
/ 01 июля 2019

Один запрос, который подходит:

SELECT sm.TimeStr AS EndTime, Max(lw.Value) AS Weight
FROM (SELECT TimeStr FROM hopper2_setpoint_met WHERE Value = 1) sm
INNER JOIN hopper2_liveweight lw ON (sm.TimeStr + INTERVAL 3 SECOND) = lw.TimeStr
GROUP BY sm.TimeStr
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...