小编典典

获取直方图的数据

mysql

有没有一种方法可以指定MySQL中的bin大小?现在,我正在尝试以下SQL查询:

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

生成的数据足够好,但是行太多。我需要的是一种将数据分组到预定义的bin中的方法。我可以从脚本语言执行此操作,但是有没有办法直接在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 | 
------------------------------

我猜想这不能直接实现,但是对任何相关存储过程的引用也可以。


阅读 475

收藏
2020-05-17

共1个答案

小编典典

这是一篇有关在MySQL中为数值创建直方图的超级快捷方法的文章。

使用CASE语句和其他类型的复杂逻辑,还有多种其他方法可以创建更好,更灵活的直方图。这种方法一次又一次地赢得了我的青睐,因为它很容易针对每个用例进行修改,而且简洁明了。这是您的操作方式:

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

只需将numeric_value更改为您的列,更改舍入增量就可以了。我已经将条形图设为对数刻度,这样当您具有较大的值时,它们就不会增长太多。

为了确保第一个存储桶包含的元素与后续存储桶一样多,应在ROUNDing操作中根据舍入增量对numeric_value进行偏移。

例如,对于ROUND(numeric_value,-1),范围[0,4](5个元素)中的numeric_value将放置在第一个存储桶中,而[5,14](10个元素)在第二个存储桶中,[15,24]在第三个存储桶中,除非numeric_value通过ROUND(numeric_value-5,-1)适当偏移。

这是对一些看起来很漂亮的随机数据进行这种查询的示例。足够用于快速评估数据。

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

2020-05-17