【问题标题】:MySQL: How can I calculate the median in a specific radius (longitude / latitude)MySQL:如何计算特定半径(经度/纬度)的中位数
【发布时间】:2016-09-28 23:44:58
【问题描述】:

我想计算特定半径内给定坐标的中位数和平均值。

重要的属性是: - 纬度 - 经度 - 价格

计算平均值的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 没有 median() 函数。

编辑: 现在我已经尝试了Simple way to calculate median with MySQL的代码

SELECT AVG(middle_values) AS 'median' FROM (
  SELECT t1.price AS 'middle_values' FROM
    (
      SELECT @row:=@row+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;

它适用于所有 200'000 条记录,但是当我添加 WHERE distance &lt;= 20 时,mysql - 请求已重载。

SELECT AVG(middle_values) AS 'median' FROM (
  SELECT t1.price AS 'middle_values' FROM
    (
      SELECT @row:=@row+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;

是不是哪里出了问题?

【问题讨论】:

  • 问题是?
  • 如何计算给定坐标和半径中价格的中位数。 MySQL 没有 median() 函数。
  • 我强烈建议您使用平均值甚至标准差。计算中位数是可能的,但如果计算距离,查询会相当复杂。

标签: mysql sql latitude-longitude median


【解决方案1】:

问题在于表格扫描来计算距离,而不是中位数。

  • 将数据放在TEMPORARY TABLE 中,这样您就不必评估它 3 次(平均值、计数和中位数)。
  • 在最里面的WHERE 添加一个“边界框”,将检查限制为 20x20 的“正方形”。
  • INDEX(latitude)
  • 使用HAVING distance &lt; 20 而不是需要另一个子查询。

【讨论】:

    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多