mysql — добавление столбцов псевдонимов в качестве нового столбца

У меня есть следующий запрос 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 ответа
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 часов назад

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *