2

価格の中央値を数えようとしています。私はここでそれを行う方法の答えを見つけました-MySQLで中央値を計算する簡単な方法ですが、それは私にはうまくいきません、私は空の結果を受け取ります。誰か助けてもらえますか?

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
4

1 に答える 1

3

AFAIUあなたの質問。

@velcrowによるこの回答は、中央値を正常に計算します。残念ながら、2つの中央の行の平均値を計算する代わりに偶数の行がある場合、クエリは2番目の値を返します。私はあなたのニーズに合うようにクエリにいくつかの変更を加えました:

--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; 

sqlfiddleのサンプルデータでテストする

于 2013-03-11T13:18:24.870 に答える