2016-09-28 16 views
0

Я хочу рассчитать средний и средний для заданных координат в определенном радиусе.MySQL: Как вычислить медиану в определенном радиусе (долгота/широта)

важные характеристики являются: - широта - долгота - цена

SQL-команды, чтобы вычислить среднее значение:

SELECT avg(price) as average 
FROM (SELECT r.*, 
      (6371 * acos(cos(radians(37.3541079)) * cos(radians(ANY_VALUE(`latitude`))) * cos(radians(ANY_VALUE(`longitude`)) - radians(-121.9552356)) + sin(radians(37.3541079)) * sin(radians(ANY_VALUE(`latitude`))))) AS distance 
     FROM `Rental` r 
    ) r 
WHERE distance <= 20; 

Мой вопрос, как я могу вычислить медиану по цене в заданных координатах и ​​радиусе. У MySQL нет медианы().

EDIT: Теперь я попробовал код из Simple way to calculate median with MySQL

SELECT AVG(middle_values) AS 'median' FROM (
    SELECT t1.price AS 'middle_values' FROM 
    (
     SELECT @row:[email protected]+1 as `row`, x.price 
     FROM rental AS x, (SELECT @row:=0) AS r 
     WHERE 1 
     -- put some where clause here 
     ORDER BY x.price 
    ) AS t1, 
    (
     SELECT COUNT(*) as 'count' 
     FROM rental x 
     WHERE 1 
     -- put same where clause here 
    ) AS t2 
    -- the following condition will return 1 record for odd number sets, or 2 records for even number sets. 
    WHERE t1.row >= t2.count/2 and t1.row <= ((t2.count/2) +1)) AS t3; 

Он работает для всех записей 200000, но когда я добавить WHERE distance <= 20 является MySQL - запрос перегружен.

SELECT AVG(middle_values) AS 'median' FROM (
    SELECT t1.price AS 'middle_values' FROM 
    (
     SELECT @row:[email protected]+1 as `row`, x.price 
     FROM rental AS x, (SELECT @row:=0) AS r, (SELECT a.*, 
      (6371 * acos(cos(radians(37.3541079)) * cos(radians(ANY_VALUE(`latitude`))) * cos(radians(ANY_VALUE(`longitude`)) - radians(-121.9552356)) + sin(radians(37.3541079)) * sin(radians(ANY_VALUE(`latitude`))))) AS distance 
     FROM `Rental` a 
    ) a 
     WHERE distance <= 20 
     -- put some where clause here 
     ORDER BY x.price 
    ) AS t1, 
    (
     SELECT COUNT(*) as 'count' 
     FROM rental x, (SELECT a.*, 
      (6371 * acos(cos(radians(37.3541079)) * cos(radians(ANY_VALUE(`latitude`))) * cos(radians(ANY_VALUE(`longitude`)) - radians(-121.9552356)) + sin(radians(37.3541079)) * sin(radians(ANY_VALUE(`latitude`))))) AS distance 
     FROM `Rental` a 
    ) a 
     WHERE distance <= 20 
     -- put same where clause here 
    ) AS t2 
    -- the following condition will return 1 record for odd number sets, or 2 records for even number sets. 
    WHERE t1.row >= t2.count/2 and t1.row <= ((t2.count/2) +1)) AS t3; 

Есть ли какие-то ошибки?

+0

и вопрос есть? – e4c5

+0

Как рассчитать медианную цену в заданных координатах и ​​радиусе. У MySQL нет медианы(). – Severin

+2

Возможный дубликат [Простой способ вычисления медианы с MySQL] (http://stackoverflow.com/questions/1291152/simple-way-to-calculate-median-with-mysql) – e4c5

ответ

0

Проблема заключается в сканировании таблицы, чтобы вычислить расстояния, а не медианную.

  • Поместите данные в TEMPORARY TABLE, чтобы вы не оценили его 3 раза (средний, средний и средний).
  • Добавить «ограничительную шкатулку» к самому внутреннему WHERE, чтобы ограничить проверку до 20x20 «квадрата».
  • INDEX(latitude)
  • Используйте HAVING distance < 20 вместо того, чтобы использовать еще один подзапрос.