У меня есть следующий запрос mysql …
select x.timest,
max(case when x.devloc="outside" then x.value end) as outside,
max(case when x.devloc="hvac_main_return" then x.value end) as hvac_main_return,
max(case when x.devloc="hvac_main_supply" then x.value end) as hvac_main_supply
from sample x where date(timest) = curdate()
group by timest
order by timest desc;
Это дает мне такой вывод:
+---------------------+---------+------------------+------------------+
| timest | outside | hvac_main_return | hvac_main_supply |
+---------------------+---------+------------------+------------------+
| 2021-01-28 23:59:54 | 24.8000 | 67.4375 | 82.9625 |
| 2021-01-28 23:58:45 | 24.9125 | 67.1000 | 80.8250 |
| 2021-01-28 23:57:42 | 24.9125 | 66.0875 | 78.2375 |
| 2021-01-28 23:56:33 | 24.9125 | 64.9625 | 74.8625 |
| 2021-01-28 23:55:32 | 25.0250 | 62.3750 | 73.0625 |
| 2021-01-28 23:54:17 | 25.0250 | 62.8250 | 74.7500 |
+---------------------+---------+------------------+------------------+
Кто-нибудь знает, как я могу добавить разницу между hvac_main_return и hvac_main_supply в качестве другого столбца?
РЕДАКТИРОВАТЬ: Дополнительная информация по запросу:
mysql> show create table sampleG
*************************** 1. row ***************************
Table: sample
Create Table: CREATE TABLE `sample` (
`property` varchar(50) DEFAULT NULL,
`devloc` varchar(50) DEFAULT NULL,
`sensortype` varchar(50) DEFAULT NULL,
`timest` datetime DEFAULT NULL,
`value` decimal(8,4) NOT NULL,
KEY `property` (`property`),
KEY `devloc` (`devloc`),
KEY `sensortype` (`sensortype`),
KEY `timest` (`timest`),
KEY `value` (`value`),
KEY `timest_2` (`timest`,`devloc`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
2 ответа
Попробуй это:
select x.timest,
max(case when x.devloc="outside" then x.value end) as outside,
max(case when x.devloc="hvac_main_return" then x.value end) as hvac_main_return,
max(case when x.devloc="hvac_main_supply" then x.value end) as hvac_main_supply,
((max(case when x.devloc="hvac_main_return" then x.value end)) -
(max(case when x.devloc="hvac_main_supply" then x.value end))) AS diff
from sample x where date(timest) = curdate()
group by timest
order by timest desc;
Если вам нужен более подробный ответ, предоставьте образцы данных, как в скрипке, которую я сделал. Вот. Кроме того, укажите здесь желаемый результат — всегда указывайте здесь все, что вы включаете в любую скрипку (Linkrot).
Обернув текущий запрос как подзапрос:
SELECT timest,
outside,
hvac_main_return,
hvac_main_supply,
hvac_main_supply - hvac_main_return AS hvac_main_net
FROM
(SELECT x.timest,
max(CASE WHEN x.devloc="outside" THEN x.value END) AS outside,
max(CASE WHEN x.devloc="hvac_main_return" THEN x.value END) AS hvac_main_return,
max(CASE WHEN x.devloc="hvac_main_supply" THEN x.value END) AS hvac_main_supply
FROM sample x
WHERE date(timest) = curdate()
GROUP BY timest) AS y
ORDER BY timest DESC;
Так GROUP BY
находится в подзапросе, потому что он необходим для выполнения max
, Однако ORDER BY
находится за пределами подзапроса, так как он будет проигнорирован в подзапросе (порядок подзапроса не важен для результата, только внешний запрос).
Спасибо, дан … Когда я запускаю запрос в вашем ответе, я получаю следующую ошибку: ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с ‘(SELECT x.timest, max (CASE WHEN x.devloc =’ outside ‘THEN x.value END) A’ в строке 6
— микем
22 часов назад
Пропустил
FROM
при редактировании. Вернемся туда сейчас.— danblack
20 часов назадя это сделал Сюда — сравнить планы (неявное предположение — планы 5.7 [similar to | the same as] 8.0 ед.). Могли перевернуть значения — просто поменяйте их местами!
— Вераче
20 часов назад
Спасибо, Дэн и Верас. Когда я запускаю каждый из ваших запросов с добавленным «пределом 800», возникает огромное расхождение в производительности. Запрос Дэна занимает 10 минут 31 секунду, тогда как на запрос Вераче требуется всего 0,7 секунды. Если я не использую лимит и просто позволяю им вытащить полный набор данных, они оба будут работать примерно одинаково, между 10-11 минутами. Почему один запрос превосходит другой с таким большим отрывом при использовании «limit»?
— микем
5 часов назад