#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
спасибо за ваш вклад