Внутреннее соединение по вычисляемому столбцу

У меня проблемы с написанием запроса, который выполняет внутреннее соединение.

В моей таблице базы данных есть столбцы Дата, Высокая температура, Низкая температура. Я хочу рассчитать такие вещи, как самая высокая температура по месяцам в году, извлекая дату, когда они произошли одновременно. Это отлично работает, используя запрос ниже:

SELECT ds.Date, 
    MONTH(ds.Date) AS Month, 
    ds.HighTemperature 
FROM WeatherData.DailyStats ds 
INNER JOIN (SELECT MONTH(Date) AS Month, 
        Date, 
        MAX(HighTemperature) AS HighTemperature 
    FROM WeatherData.DailyStats GROUP BY Month) ds2 
    ON MONTH(ds.Date) = MONTH(ds2.Date) AND ds.HighTemperature = ds2.HighTemperature 
ORDER BY MONTH(ds.Date), ds.DATE ASC

Это дает мне 12 строк, по одной на каждый месяц в году. Каждая строка содержит номер месяца, самую высокую температуру, зафиксированную в этом месяце, и дату, когда она возникла.

Теперь, когда у меня нет никаких успехов, это когда я пытаюсь сделать что-то немного более сложное - вместо того, чтобы запускать запрос непосредственно на HighTemperature, я хочу найти самые высокие дневные диапазоны температур для каждого месяца, то есть получить такие же результаты для (HighTemperature - LowTemperature) AS TemperatureRange .

Как я могу изменить запрос для этого?

Одна проблема, с которой вы можете столкнуться, заключается в том, что когда две даты имеют одинаковую высокую температуру в одном месяце, вы получите две выходные строки для этого месяца. В этом отношении может помочь добавление подходящей группы. Что касается получения того же самого для диапазона температур, вы сможете получить это, просто заменив HighTemperature на свою формулу. Но, опять же, для получения правильных результатов вам нужно добавить группу до. Кроме того, столбец даты в подвыборке не имеет значения и, поскольку нет группировки по, неточен.

Sloan Thrasher 19.11.2018 22:45

@SloanThrasher Дата в подзапросе используется в операторе соединения ON. Также я не могу просто заменить свою формулу, потому что часть ds.HighTemperature = ds2.HighTemperature больше не работает должным образом, поскольку нет столбца ds.TemperatureRange

dgb_nz 19.11.2018 23:01
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
235
1

Ответы 1

Ах, понял!

Проблема, с которой я столкнулся, заключалась в том, что в операторе ON я пытался сгруппировать на TemperatureRange = ds2.TemperatureRange, где TemperatureRange был получен из первого запроса.

Вместо этого, если я заменю его на ds.HighTemperature - ds.LowTemperature = ds2.TemperatureRange, все будет хорошо!

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