1. ホーム
  2. mysql

[解決済み] ヒストグラムプロットのためのデータ取得

2023-03-23 23:32:10

質問

MySQL で bin のサイズを指定する方法はありますか?今、私は以下のSQLクエリを試しています。

select total, count(total) from faults GROUP BY total;

生成されるデータは十分に良いものですが、行数が多すぎます。必要なのは、データをあらかじめ定義されたビンにグループ化する方法です。スクリプト言語からこれを行うことができますが、SQL で直接これを行う方法はありますか?

+-------+--------------+
| total | count(total) |
+-------+--------------+
|    30 |            1 | 
|    31 |            2 | 
|    33 |            1 | 
|    34 |            3 | 
|    35 |            2 | 
|    36 |            6 | 
|    37 |            3 | 
|    38 |            2 | 
|    41 |            1 | 
|    42 |            5 | 
|    43 |            1 | 
|    44 |            7 | 
|    45 |            4 | 
|    46 |            3 | 
|    47 |            2 | 
|    49 |            3 | 
|    50 |            2 | 
|    51 |            3 | 
|    52 |            4 | 
|    53 |            2 | 
|    54 |            1 | 
|    55 |            3 | 
|    56 |            4 | 
|    57 |            4 | 
|    58 |            2 | 
|    59 |            2 | 
|    60 |            4 | 
|    61 |            1 | 
|    63 |            2 | 
|    64 |            5 | 
|    65 |            2 | 
|    66 |            3 | 
|    67 |            5 | 
|    68 |            5 | 
------------------------

私が探しているもの

+------------+---------------+
| total      | count(total)  |
+------------+---------------+
|    30 - 40 |            23 | 
|    40 - 50 |            15 | 
|    50 - 60 |            51 | 
|    60 - 70 |            45 | 
------------------------------

ストレートな方法では実現できないのでしょうが、関連するストアドプロシージャへの参照でも良いでしょう。

どのように解決するのですか?

これは、数値のヒストグラムを作成するための超簡単な方法についての記事です。 を作成する超簡単な方法についての記事です。

ヒストグラムを作成する方法には、CASE 文やその他の複雑なロジックを使用する、より優れた、より柔軟な方法が他にも複数あります。

CASE ステートメントやその他の複雑なロジックを使用した、より優れた柔軟なヒストグラムの作成方法もあります。

この方法は、各使用例に合わせて変更するのが非常に簡単であり、短くて簡潔であるため、何度も繰り返し使用されます。 というのも、この方法は非常に簡単で、各ユースケースに合わせて変更することができ、また、非常に短く簡潔だからです。このように です。

SELECT ROUND(numeric_value, -2)    AS bucket,
       COUNT(*)                    AS COUNT,
       RPAD('', LN(COUNT(*)), '*') AS bar
FROM   my_table
GROUP  BY bucket;

numeric_valueを任意のカラムに変更し、丸め増分を変更するだけです。 丸め増分を変更するだけです。棒グラフは対数スケールで表示されるようにしました。 対数スケールで表示されるようにしました。 棒グラフは対数スケールにしています。

numeric_valueは、最初のバケットが次のバケットと同じ数の要素を含むようにするため、丸め増分に基づき、ROUND処理でオフセットされる必要があります。

例えば、ROUND(numeric_value,-1) を使用すると、numeric_value が ROUND(numeric_value - 5, -1) によって適切にオフセットされていなければ、範囲 [0,4] (5 elements) の numeric_value は最初のバケットに、 [5,14] (10 elements) は2番目、 [15,24] は3番目に置かれることになります。

これは、いくつかのランダムなデータに対するこのようなクエリの例で、とても素敵に見えます。

+--------+----------+-----------------+
| bucket | count    | bar             |
+--------+----------+-----------------+
|   -500 |        1 |                 |
|   -400 |        2 | *               |
|   -300 |        2 | *               |
|   -200 |        9 | **              |
|   -100 |       52 | ****            |
|      0 |  5310766 | *************** |
|    100 |    20779 | **********      |
|    200 |     1865 | ********        |
|    300 |      527 | ******          |
|    400 |      170 | *****           |
|    500 |       79 | ****            |
|    600 |       63 | ****            |
|    700 |       35 | ****            |
|    800 |       14 | ***             |
|    900 |       15 | ***             |
|   1000 |        6 | **              |
|   1100 |        7 | **              |
|   1200 |        8 | **              |
|   1300 |        5 | **              |
|   1400 |        2 | *               |
|   1500 |        4 | *               |
+--------+----------+-----------------+

いくつか注意点があります。一致するものがないレンジは、カウントに表示されません。 カウントカラムにゼロが表示されることはありません。また、ここでは ROUND 関数を使っています。この関数をTRUNCATEに置き換えてもかまいません。 に置き換えることもできます。

私はここでそれを見つけました http://blog.shlomoid.com/2011/08/how-to-quickly-create-histogram-in.html