MySQLで列の中央値を見つけるにはどうすればよいですか?


10

2つのデータベースクエリでこれを実行することしか想像できません。1つ目はデータベース内の行数を検索し、2つ目ORDER BYは関心のある列をLIMIT X, 1X で選択します。Xは行数の半分です。

1つのクエリのみでこれを行う簡単な方法はありますか?

現在、計算には平均を使用していますが、平均はより良いと思います。値に上限はなく、値は下から0で制限されます。


編集:はい、私は「中央値」と言うつもりでしたが、いくつかの脳のエラーがあり、「平均値」を検索しました。私は今stackoverflowで答えを見つけました


meta少し読んだ後、この質問がここにあるか、SOにあるべきかを判断するための分裂があるようです。これは忍者レベルのクエリではない可能性があることを認識していますが、困惑しており、私が働いている会社にはDBAがいません(合計6人)。
JIStone 2011年

回答:


6

MySQLテーブルから中央値を計算することについては、ここでかなりの議論があります。ページで「中央値」を検索してください。

余談ですが、これを行うための組み込み関数がないことを忘れてしまいます。多くの場合、中央値は平均よりも中心傾向を説明します。Access / VBAの関数リストには同じ穴があります。


同意する。大規模なクエリを処理する場合、余分な行を追加すると、全体がより煩雑になり、デバッグや保守が困難になります。
JIStone 2011

2

単一のクエリで中央値を取得できるソリューションはどこにもありません。一時テーブルは気にしませんが、必要ない場合は素晴らしいです!これが私が思いついたものです:

SELECT AVG(profit) median, nofitems FROM(
  SELECT x.profit, SUM(SIGN(1.0-SIGN(y.profit-x.profit))) diff, count(*) nofitems, floor(count(*)+1/2)
  FROM brand_prof x, brand_prof y
  GROUP BY x.profit
  HAVING SUM(SIGN(1.0-SIGN(y.profit-x.profit))) = floor((COUNT(*)+1)/2)
      OR SUM(SIGN(1.0-SIGN(y.profit-x.profit))) = ceiling((COUNT(*)+1)/2)
) x;

私はこれを偶数のセットでテストし、正しい答えを得ました。brand_profは、brand_nameと10進数値であるprofitの2つの列です。これが整数値の場合、テストした以上に "ceiling((CAST COUNT(*)AS DECIMAL)...")をキャストする必要があるかもしれません。デカルト積を使用し、符号の合計を関連付けるクールなアイデアは、残念ながら私は作者を忘れてしまいました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.