#mysql #sql
Вопрос:
В этом случае я хочу выбрать среднее значение значений в столбце значение на основе вложенного условия:
- Во-Первых, я должен Сгруппироваться По «Кластеру». Если есть хотя бы одно или более «N», я беру среднее значение и отмечаю его как ВЫХОДНОЙ СТОЛБЕЦ Для этого кластера. Дополнительное Условие:
- Если в этом кластере есть все Y (столбец HCF Y/N) (пример BC2), сгруппируйте их по столбцу «PL», а затем возьмите среднее значение этих значений.
- Если в PL есть все Y(пример PL2), сгруппируйте их по «Заводу» и возьмите среднее значение этих значений.
- Если на заводе есть все Y, вы отмечаете значение по умолчанию N/A.
Весь вышеперечисленный выбор должен подразумеваться в этом кластере для этой комбинации BG Mat растений. Как для этого сформировать SQL-запрос?
Комментарии:
1. Пожалуйста, не ссылайтесь на изображения данных, добавьте информацию в виде редактируемого текста в свой вопрос 1) Гораздо сложнее понять ваш вопрос, когда информация и данные находятся в разных местах 2) если кто-то хочет опробовать возможное решение, ему нужно иметь возможность копировать ваши данные, а не вводить их вручную
2. 1) Предоставьте примеры данных в виде СОЗДАТЬ ТАБЛИЦУ ВСТАВИТЬ В скрипт. 2) Примеры данных должны включать группы для каждого условия в вашем списке условий. 3) Предоставьте желаемые выходные данные для этого образца данных. 4) Укажите точную версию MySQL.
Ответ №1:
Вашим условиям довольно трудно следовать, потому что ваш образ включает в себя только одно или два из них. Но вам, похоже, нужны средние значения по условным окнам:
select t.*,
(case when sum(hcv = 'N') over (partition by cluster) > 0
then avg(value) over (partition by cluster)
when sum(hcv = 'N') over (partition by pl) > 0
then avg(value) over (partition by pl)
when sum(hcv = 'N') over (partition by plant) > 0
then avg(value) over (partition by plant)
end) as output
from t;
Обратите внимание , что значение по умолчанию равно NULL
«нет 'N/A'
«. AVG()
возвращает число, которое не должно смешиваться со строками.