Выполнение различных функций агрегирования для разных строк выходных данных, возвращаемых предложением group by

Я столкнулся с этим вопросом на платформе кодирования Дана одна единственная таблица. Он имеет следующий формат:

Температурные_записи

Дата записи Тип данных Значение_данных 2020-07-01 Макс 92 2020-07-01 мин 71 2020-07-01 среднее 74 2020-07-02 Макс 90 2020-07-02 мин 67 2020-07-02 среднее 77

Таблица состоит из показаний минимальной, максимальной и средней температуры за каждый день за шесть месяцев 2020 года. Нам необходимо рассчитать месячную минимальную, среднемесячную, месячную максимальную температуру. Вывод должен быть таким: (Минимальная, максимальная и средняя температуры должны быть округлены до ближайшего целого числа)

Месяц Мин Макс Среднее 7 92 99 95 8 91 100 94

Теперь я использовал следующий запрос:

select table1.month, table1.data_type, table1.data_value
from (
    select substring(record_date, 6, 2) as "month", data_type, data_value
    from temperature_records
) table1
order by table1.month, table1.data_type;

Этот запрос дает мне результат, который выглядит следующим образом:

Месяц тип данных значение_данных 7 среднее 97 7 среднее 98

Возвращает помесячные записи Теперь, если я группирую записи по (месяц, тип_данных), мне нужно выполнить функцию агрегирования записей в зависимости от их типа_данных. Как мне это сделать? Кроме того, как я могу вернуть записи в соответствии с желаемым форматом вывода?

Угадай, что? MySQL — это совершенно другой продукт, чем SQL Server. Сделайте себе одолжение и исправьте свои теги, чтобы нужные эксперты просмотрели ваше сообщение.

Dale K 25.06.2024 08:40

Вы храните даты в столбце char/varchar?!? Вместо этого используйте правильный тип данных.

jarlh 25.06.2024 08:51

Нет необходимости задействовать год? Что произойдет, если в вашей таблице будут данные за период более одного года?

jarlh 25.06.2024 08:54

Проблема на платформе кодирования хранила дату в столбце varchar. Я должен был принять во внимание год. Но учитывая, что в таблице были данные только за 2020 год. Мне нужно было решить задачу до того, как у меня закончится время, поэтому я сосредоточился только на месяце @jarlh

gollapudi sravani 25.06.2024 09:04

@gollapudisravani Если вас не волнуют годы, используйте запрос в этого ответа . Если вам также необходимо сгруппировать данные по годам, расширьте запрос. Проверьте этот образец скрипта, чтобы увидеть разницу.

Jonas Metzler 25.06.2024 09:07
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Здесь мы можем использовать условную агрегацию для общего решения:

SELECT
    MONTH(Record_date) AS Month,
    MAX(CASE WHEN Data_type = 'min' THEN Data_value END) AS Min,
    MAX(CASE WHEN Data_type = 'max' THEN Data_value END) AS Max,
    MAX(CASE WHEN Data_type = 'avg' THEN Data_value END) AS Avg
FROM temperature_records
GROUP BY 1
ORDER BY 1;

Спасибо за ответ. Задаю этот вопрос только для того, чтобы подтвердить, что я правильно понял код: Итак, мы группируем записи temp_records по месяцам, а затем выполняется выбор для каждой из этих групп. Итак, каждая агрегация выполняется для конкретной группы, верно? @Тим Бигелайзен

gollapudi sravani 25.06.2024 10:28

Правильно... для каждой группы одинаковых записей месяца он выбирает максимальное значение в столбце типа данных. Когда условие истинно (для соответствующей строки), оно принимает максимальное значение данных, в противном случае оно принимает максимальное значение NULL, которое просто игнорируется при агрегировании.

Tim Biegeleisen 25.06.2024 10:34

Это то, чего ты хотел?

Попробуйте это,

Select * into #Temprecords from 
(Select '2020-07-01' Record_date, 'max' Data_Type, 92 Data_Value Union 
Select '2020-07-01' Record_date, 'min' Data_Type, 71 Data_Value Union 
Select '2020-07-01' Record_date, 'avg' Data_Type, 74 Data_Value Union 
Select '2020-07-02' Record_date, 'max' Data_Type, 90 Data_Value Union 
Select '2020-07-02' Record_date, 'min' Data_Type, 67 Data_Value Union 
Select '2020-07-02' Record_date, 'avg' Data_Type, 77 Data_Value ) A


;With Temprecords as   
(Select Month(Record_date) Mth
  ,Case Data_Type When 'min' Then min(Data_Value) Else 0 END as MinTemp
  ,Case Data_Type When 'max' Then max(Data_Value) Else 0 End as MaxTemp
  ,Case Data_Type When 'avg' Then avg(Data_Value) Else 0 End as AvgTemp
from #TempRecords
Group By Month(Record_date), Data_Type
)

Select Mth as 'Month', SUM(MinTemp) 'Min', SUM(MaxTemp) 'Max', SUM(AvgTemp) 'AVG'
From Temprecords 
Group By Mth
  
DROP table #TempRecords

Я отмечаю, что ссылка ведет на скрипт sql-сервера, но вопрос помечен как mysql, а код синтаксически неверен. dbfiddle.uk/mkSjiZ3f

P.Salmon 25.06.2024 09:28

:( пропустил это заметить.

Meera K 25.06.2024 13:35

Другие вопросы по теме

Похожие вопросы

Получите значения столбцов A таблицы 1 и значений столбца B таблицы 2 с тем же идентификатором
Как выбрать следующее наименьшее значение и следующее наибольшее значение из определенного значения записи, которое было помечено?
Хранимая процедура: добавьте параметр для месяца или часа
Как эффективно самостоятельно присоединиться к одной и той же таблице несколько раз с порядком сортировки по возрастанию и убыванию?
Запретить SQL сопоставлять конечные пробелы и вместо этого явно сопоставлять условие
Как вы можете вычислить, является ли результат десятичным или целым числом в SQL?
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ НА ДВУХ ТАБЛИЦАХ MYSQL С 3 СВЯЗАННЫМИ КОЛОННАМИ
Подзапрос INSERT INTO SELECT, который использует udf и возвращает 1 значение
Файл содержит значения даты как «01.09.2015 14:30:00». Но после импорта в таблицу oracle все значения даты отображаются как «20-01-19 15:12:15.00000 PM»
Как поднять ошибку, если условие не соответствует