mysql - 通过 SQL 获取值分布

标签 mysql sql histogram

在 MySQL 数据库中,有一个包含单个数字 value 的表柱子。我想将这些值的分布绘制为条形图。图表中每个条形的宽度应统一,每个条形的高度应反射(reflect)此范围内的条目数。

例如,如果值的范围是从 -10..90并且范围(条)的数量为 10,则图表中的第一个条应显示范围 -10..0 中的条目数最后一个应显示 80..90 范围内的条目数.

有没有比以下更好的计算条形图数据的方法:

  1. 使用 select min(value), max(value) from mytable 获取最小值和最大值
  2. 计算每个范围的上限和下限(在应用程序代码中)
  3. 使用 select count(*) from mytable where value between X and Y 获取每个范围内值的数量

这种简单方法的一个问题是需要发出一个单独的查询来查找每个范围内的值的数量,是否有可能使它更有效,例如通过动态构建查询并使用 GROUP BY

最佳答案

SELECT * FROM my_table;
+----+-----+
| id | val |
+----+-----+
|  1 |  19 |
|  2 |  10 |
|  3 |   6 |
|  4 |  29 |
|  6 |  27 |
|  7 |  20 |
|  8 |  11 |
|  9 |  12 |
| 13 |  16 |
| 14 |  38 |
| 15 |   8 |
| 16 |  22 |
| 17 |  23 |
| 18 |  16 |
| 19 |  20 |
| 20 |  18 |
| 28 |  18 |
| 29 |   7 |
| 30 |  10 |
| 31 |  34 |
| 32 |  11 |
| 33 |  17 |
| 34 |  15 |
| 35 |  12 |
| 36 |  19 |
| 37 |  15 |
| 38 |  18 |
| 39 |  24 |
| 40 |  10 |
| 41 |  19 |
| 42 |  25 |
| 43 |  22 |
| 59 |  27 |
| 60 |  14 |
| 61 |  17 |
| 62 |  25 |
| 63 |  28 |
| 64 |  20 |
| 65 |  10 |
| 66 |  18 |
| 67 |  22 |
| 68 |  12 |
| 69 |  18 |
| 70 |  31 |
| 71 |  22 |
| 72 |  23 |
| 73 |  20 |
| 74 |  12 |
| 75 |  10 |
| 76 |   9 |
| 77 |  21 |
| 78 |  18 |
| 79 |  14 |
| 80 |  17 |
| 81 |   7 |
| 82 |  21 |
| 83 |  11 |
| 84 |  16 |
| 85 |  19 |
| 86 |  30 |
| 87 |  11 |
| 88 |  18 |
| 89 |  26 |
| 90 |  16 |
+----+-----+

SELECT CEILING(((1+val-(SELECT MIN(val) FROM my_table)))/ROUND((SELECT MAX(val)-MIN(val) FROM my_table)/8)) x
     , COUNT(*)
     , GROUP_CONCAT(LPAD(val,2,0) ORDER BY val) n
  FROM my_table
 GROUP
    BY CEILING(((1+val-(SELECT MIN(val) FROM my_table)))/ROUND((SELECT MAX(val)-MIN(val) FROM my_table)/8)); 
+------+----------+----------------------------------------------------+
| x    | COUNT(*) | n                                                  |
+------+----------+----------------------------------------------------+
|    1 |        5 | 06,07,07,08,09                                     |
|    2 |       13 | 10,10,10,10,10,11,11,11,11,12,12,12,12             |
|    3 |       11 | 14,14,15,15,16,16,16,16,17,17,17                   |
|    4 |       17 | 18,18,18,18,18,18,18,19,19,19,19,20,20,20,20,21,21 |
|    5 |        9 | 22,22,22,22,23,23,24,25,25                         |
|    6 |        5 | 26,27,27,28,29                                     |
|    7 |        2 | 30,31                                              |
|    8 |        1 | 34                                                 |
|    9 |        1 | 38                                                 |
+------+----------+----------------------------------------------------+

关于mysql - 通过 SQL 获取值分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24634974/

相关文章:

PHP 日期未以正确的格式插入

mysql - 在 SQL 中选择随机图像封面

python - 使用不同的权重创建堆叠的 2D 直方图

r - 了解 hist() 和 R 中的中断间隔

mysql - 使用适当的主键和索引对相对较小的表进行缓慢的 MySQL 查询

python - 如何在 Pandas read_sql() 中使用通配符 (%)

mysql - 带插入的 WHILE 循环未按预期工作

mysql - 如何在mysql View 中重用别名列?

php - 在单个查询中选择的安全行数

performance - 使两个直方图成比例的算法,最小化了删除的单位