MySQL を使用して中央値を計算する最も簡単な (そしてできれば遅すぎない) 方法は何ですか? AVG(x)
を使用して平均値を見つけましたが、中央値を計算する簡単な方法を見つけるのに苦労しています。現在、すべての行を PHP に返し、ソートしてから中央の行を選択していますが、これを 1 つの MySQL クエリで行う簡単な方法が必要です。
データ例:
id | val -------- 1 4 2 7 3 2 4 2 5 9 6 8 7 3
val
で並べ替えると、2 2 3 4 7 8 9
が得られるため、中央値は 4
ではなく、4
になります。 ;code>SELECT AVG(val) は 5
に等しい。
オンラインのコメントで別の答えを見つけました:
列に適切なインデックスが作成されていること、およびそのインデックスがフィルタリングと並べ替えに使用されていることを確認してください。実行計画を通じて検証します。
リーリー「中央値」行番号を計算します。使用可能な例:
median_row = Floor(count / 2)
。次にリストから選択します:
リーリーこれにより、必要な値が返されるはずです。
MariaDB/MySQL の場合:
リーリーSteve Cohenさんは、最初のパスの後、@rownum に合計行数が含まれることを指摘しました。これを使用して中央値を決定できるため、2 回目のパスや結合は必要ありません。
さらに、レコード数が偶数の場合に中央値を正しく計算するために、
リーリーAVG(dd.val)
およびdd.row_number IN(...)
が使用されます。理由は次のとおりです:最後に、MariaDB 10.3.3 には MEDIAN 関数が含まれています