MySQL - я пытаюсь отфильтровать значения от 1,1 * мин (значение) до 0,9 * макс (значение) - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть столбец ride_distance_km, и я попробовал следующее:

SELECT ride_distance_km
FROM ride_data
HAVING ride_distance_km  BETWEEN 1.1*min(ride_distance_km) and 0.9*max(ride_distance_km);

Запрос запущен, но я получаю 0 результатов, что неверно.

Попробовал ГДЕ вместо HAVING и запрос не запустился.

---exemplary data preview---

Глядя на прилагаемую фотографию, я ожидаю отфильтровать поездки на 1,2 км, 28,06 км и 30,13 км (для этих конкретных данных, конечно)

Спасибо за вашу помощь

1 Ответ

0 голосов
/ 02 ноября 2018

Having без Group by не имеет смысла , когда вы не используете агрегатные функции для полного выражения . Having применяется после фазы агрегации, и может использоваться , если вы хотите фильтровать результаты агрегирования.

Having ride_distance_km BETWEEN ... не сможет определить, какое значение строки для ride_distance_km следует рассмотреть для сравнения! Я считаю , что это не стандартный SQL, но из-за (неправильной) возможности MySQL это разрешено. Однако нет гарантии, что он даст правильные результаты (как описано выше).

Один из подходов состоит в определении значений Min() и Max() в производной таблице. Затем мы можем использовать эти агрегированные значения для дальнейшей фильтрации внутри предложения join On.

Попробуйте вместо этого следующий запрос:

SELECT rd.ride_distance_km
FROM ride_data AS rd 
JOIN 
(
 SELECT MIN(ride_distance_km) AS min_ride_distance, 
        MAX(ride_distance_km) AS max_ride_distance 
 FROM ride_data
) AS dt 
  ON rd.ride_distance_km BETWEEN 1.1*dt.min_ride_distance AND 
                                 0.9*dt.max_ride_distance
...