sql >> データベース >  >> RDS >> Mysql

MySQLで中央値を計算する方法

    変数の一般的なトランザクション値を見つけるために、売上などの一連の数値の中央値を計算する必要がある場合があります。関数がないため、SQLクエリを使用してMySQLの中央値を計算する必要があります。 MySQLで中央値を計算するための簡単なクエリを次に示します。

    MySQLで中央値を計算する方法

    MySQLで中央値を計算する手順は次のとおりです。次の表があるとします

    CREATE TABLE exams (
    id int(11) NOT NULL auto_increment,
    dt date,
    score int,
    PRIMARY KEY (id)
    );
    
    insert into exams (dt,score) values ('2019-01-01',70);
    insert into exams (dt,score) values ('2019-02-01',77);
    insert into exams (dt,score) values ('2019-03-01',71);
    insert into exams (dt,score) values ('2019-04-01',70);
    
    insert into exams (dt,score) values ('2019-05-01',89);
    insert into exams (dt,score) values ('2019-06-01',87);
    insert into exams (dt,score) values ('2019-07-01',88);
    insert into exams (dt,score) values ('2019-08-01',89);
    
    mysql> select * from exams;
    +------+------------+-------+
    | id   |     dt     | score |
    +------+------------+-------+
    |   1  | 2019-01-01 |   70  |
    |   2  | 2019-02-01 |   77  |
    |   3  | 2019-03-01 |   71  |
    |   4  | 2019-04-01 |   70  |
    |   5  | 2019-05-01 |   89  |
    |   6  | 2019-06-01 |   87  |
    |   7  | 2019-07-01 |   88  |
    |   8  | 2019-08-01 |   89  |
    +------+------------+-------+
    

    テーブルのスコアの中央値を見つけたいとしましょう。中央値は、並べ替えられた数値の配列の中央値です。配列に偶数のアイテムがある場合、中央値は中央の2つの値の平均です。

    MySQLで中央値を計算する

    スコア列の中央値を計算するためのSQLクエリは次のとおりです

    SELECT AVG(dd.score) as median_val
    FROM (
    SELECT d.score, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
      FROM exams d, (SELECT @rownum:=0) r
      WHERE d.score is NOT NULL
      -- put some where clause here
      ORDER BY d.score
    ) as dd
    WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) );
    
    +------------+
    | median_val |
    +------------+
    |    82.00   |
    +------------+
    

    上記のクエリを詳しく見てみましょう。この場合、SQLサブクエリを使用します。内部クエリは、@ rownumをインクリメンタルインデックスとして割り当て、選択した値を並べ替えます。最初のパスの最後に、@total_rowsには選択した行の行数が含まれます。外側のクエリは、@ total_rowsを使用して、値の数が奇数か偶数かに関係なく、中央値を決定します。

    フィルターを適用した後、MySQLで中央値を計算します

    80より大きい(> 80)値のみの中央値を計算するとします。これを行うには、以下に示すように、上記のクエリにwhere句を追加するだけです(太字に記載されているフィルタ条件)。 )

    SELECT AVG(dd.score) as median_val
    FROM (
    SELECT d.score, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
      FROM exams d, (SELECT @rownum:=0) r
      WHERE d.score is NOT NULL
      AND d.score>80
      ORDER BY d.score
    ) as dd
    WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) );
    
    +------------+
    | median_val |
    +------------+
    |    88.50   |
    +------------+
    

    グラフ/レポートに中央線をプロットする方法

    レポートのデータ値と一緒に中央値を表示するとします。その場合、以下に示すように、中央値の結果テーブルを元のデータテーブルとクロス結合するだけです。

    select * from exams,
    (
    SELECT AVG(dd.score) as median_val
    FROM (
    SELECT d.score, @rownum:=@rownum+1 as `row_number`, @total_rows:=@rownum
     FROM exams d, (SELECT @rownum:=0) r
     WHERE d.score is NOT NULL
     -- put some where clause here
     ORDER BY d.score
    ) as dd
    WHERE dd.row_number IN ( FLOOR((@total_rows+1)/2), FLOOR((@total_rows+2)/2) )
    ) temp;
    
    +------+------------+-------+------------+
    | id   |     dt     | score | median_val |
    +------+------------+-------+------------+
    |   1  | 2019-01-01 |   70  |   82.0000  |
    |   2  | 2019-02-01 |   77  |   82.0000  |
    |   3  | 2019-03-01 |   71  |   82.0000  |
    |   4  | 2019-04-01 |   70  |   82.0000  |
    |   5  | 2019-05-01 |   89  |   82.0000  |
    |   6  | 2019-06-01 |   87  |   82.0000  |
    |   7  | 2019-07-01 |   88  |   82.0000  |
    |   8  | 2019-08-01 |   89  |   82.0000  |
    +------+------------+-------+------------+
    

    上記のクエリでは、試験間でクロス結合を実行しました クエリの中央値の結果を含むテーブル( temp のラベルが付いています )

    これは、Ubiqを使用して作成された折れ線グラフにプロットされた上記のデータの例です。

    MySQLで中央値を計算するための要件に従って、上記のクエリをカスタマイズできます。参考までに、MariaDBには、値の列のメディアを計算するための、すぐに使用できる関数MEDIAN()が用意されています。

    MySQLデータベースからチャート、ダッシュボード、レポートを作成したい場合は、Ubiqを試すことができます。 14日間の無料トライアルを提供しています。

    1. MySQLでのLOCATE()関数のしくみ

    2. MySQLDB SScursorを効率的に使用するにはどうすればよいですか?

    3. Hibernateでの同時更新処理

    4. SQLServerインスタンスからすべてのデータベースの主キー制約がある場合とない場合のテーブルのリストを取得する-SQLServer/TSQLチュートリアルパート61