Выберите две переменные из в одном запросе MYSQL

#mysql #sql #select

#mysql #sql #выберите

Вопрос:

Я пытаюсь извлечь две переменные из одного и того же запроса MySQL в зависимости от значения переменной. Я могу извлечь эти переменные в двух отдельных запросах, но я уверен, что должна быть возможность объединить их для получения двух / столбцов данных в одном операторе, возможно, с помощью оператора if?

У меня там есть оператор JOIN, который меня немного смущает.

Первый запрос:

 SELECT variables.value as "Mean Power"
FROM variables
INNER JOIN stat_types ON variables.id=stat_types.id
WHERE stat_types.name="Mean";
  

Второй запрос:

 SELECT variables.value as "Maximum Power"
FROM variables
INNER JOIN stat_types ON variables.id=stat_types.id
WHERE stat_types.name="Max";
  

Единственное, что изменилось, это то, что имя stat_type изменяется с Max на Mean, и я хотел бы соответствующим образом изменить имя выходного столбца.

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

Редактировать: я должен дать понять, что я ищу два временных ряда, а не отдельные максимальные значения. Самое близкое, чего я сейчас достиг, — это предложенный ниже код, слегка отредактированный следующим образом:

 SELECT
    v.id,
    (CASE WHEN st.name = 'Mean' THEN v.value END) AS `Mean Power`,
    (CASE WHEN st.name = 'Max'  THEN v.value END) AS `Maximum Power`
FROM variables v
INNER JOIN stat_types st
    ON v.id = st.id
WHERE
    st.name = IN ('Mean', 'Max')
  

Что дает:

 |id|Mean Power| Maximum Power|
|1 |NULL      |9010          |
|1 |NULL      |8999          |
|1 |NULL      |9011          |
|2 |9053      |NULL          |
|2 |9040      |NULL          |
|2 |9045      |NULL          |
  

Отлично. Однако я хочу, чтобы это:

 |Mean Power| Maximum Power|
|9053      |9010          |
|9040      |8999          |
|9045      |9011          |
  

Поэтому мне нужно объединить значения мощности, и мне не нужен идентификатор в качестве вывода. Для каждого значения у меня также есть временной интервал, который можно использовать при необходимости. Для каждого временного шага есть максимальное и среднее значение (одинаковое количество значений)
Спасибо!

Ответ №1:

Возможно, здесь вы сможете использовать условную агрегацию:

 SELECT
    v.id,
    MAX(CASE WHEN st.name = 'Mean' THEN v.value END) AS `Mean Power`,
    MAX(CASE WHEN st.name = 'Max'  THEN v.value END) AS `Maximum Power`
FROM variables v
INNER JOIN stat_types st
    ON v.id = st.id
WHERE
    st.name = IN ('Mean', 'Max')
GROUP BY
    v.id;
  

Комментарии:

1. Большое вам спасибо за ваш комментарий. Я пытался реализовать это, но у меня проблема: мне нужно не только максимальное значение, но и весь временной ряд, поэтому я удалил команду MAX. Я также удалил команду GROUP BY по той же причине. При этом создается 3 столбца (id, mean pwr, max, pwr) — отлично! Однако данные не упорядочены одновременно, как хотелось бы. Я хочу, чтобы все одновременные (относящиеся к одному и тому же временному интервалу) значения max и mean power были в одной строке, вместо этого у меня есть все значения max со средним значением, равным null, затем обратное значение для средних значений. Есть идеи? Какое-то ОБЪЕДИНЕНИЕ?

2. Удаление MAX и GROUP BY полное изменение моего ответа на … что-то еще. На этом этапе вы должны добавить образец входных данных в свой вопрос, а также показать нам точный результат, который вы ожидаете.

3. Спасибо, Тим. Я попытался немного подробнее изложить свой вопрос в редактировании. Что вы думаете?

4. Не помогает. Вы показали вывод из моего ответа вместе с тем, что вы хотите увидеть. Вам необходимо выбрать исходные данные с ожидаемым результатом.

5. Спасибо, Тим. В конце концов я решил это, просто объединив два запроса select с внутренним соединением по дате.

Ответ №2:

Оказывается, проблема здесь заключается в объединении двух запросов select и создании двух столбцов «параллельных» данных. Ключом к ее решению было знание того, что каждое из значений, которые я хотел бы вывести, связано с датой, поэтому, в конце концов, это был просто случай объединения двух запросов select на основе даты:

 SELECT Max as "Max Power", Mean as "Mean Power" FROM 

(SELECT variables.date as "date", variables.value as "Mean Power"
FROM variables
INNER JOIN stat_types ON variables.id=stat_types.id
WHERE stat_types.name="Mean") as Mean

INNER JOIN

(SELECT variables.date as "date", variables.value as "Max Power"
FROM variables
INNER JOIN stat_types ON variables.id=stat_types.id
WHERE stat_types.name="Max") as Max

ON Max.date=Mean.date

  

спасибо за ваш вклад