Search code examples
mysqlmedian

MySQL: count median value


I'm trying to count median for prices. I founded answer how to do it here- Simple way to calculate median with MySQL, but it doesn't work for me, I get empty result. Can anyone help?

SELECT x.price from mediana as x, mediana y
GROUP BY x.price
HAVING SUM(SIGN(1-SIGN(y.price-x.price))) = (COUNT(*)+1)/2

Solution

  • AFAIU your question.

    This answer by @velcrow calculates median value successfully. Unfortunately when there is even number of rows instead of calculating the mean value of 2 middle rows query just returns second value. I've made a couple of modifications to the query to fit your needs:

    --average value for middle rows
    SELECT avg(t1.price) as median_val FROM (
    SELECT @rownum:=@rownum+1 as `row_number`, d.price
      FROM mediana d,  (SELECT @rownum:=0) r
      WHERE 1
      -- put some where clause here
      ORDER BY d.price
    ) as t1, 
    (
      SELECT count(*) as total_rows
      FROM mediana d
      WHERE 1
      -- put same where clause here
    ) as t2
    WHERE 1
    --this condition should return one record for odd number of rows and 2 middle records for even.
    AND t1.row_number>=total_rows/2 and t1.row_number<=total_rows/2+1; 
    

    Test on sample data on sqlfiddle