2017-09-27 70 views
0

我正在寻找一种将MYSQL数据分组为桶(值范围)的方法,然后计算每个组中有多少个值,然后将其绘制在图上。MYSQL - 如何根据范围对数据进行分组并计数

我有很多的范围,不是像这里我会手动做的很少。

例如,如果我的数据看起来像:

+--------+ 
| column | 
+--------+ 
|  1 | 
|  2 | 
|  10 | 
|  15 | 
|  20 | 
| 100 | 
| 150 | 
| 1000 | 
| 10000 | 
+--------+ 

我可以创建水桶和计数每个桶中的值的数目:

+-------------+---------------+-----------------+-----------------+ 
| bucket(0-9) | bucket(10-99) | bucket(100-999) | bucket(1000-1M) | 
+-------------+---------------+-----------------+-----------------+ 
|   2 |    3 |    2 |    2 | 
+-------------+---------------+-----------------+-----------------+ 
  • 计数(0-9)=> 2值
  • 计数(10-99)=> 3值
  • 计数(100-999)=> 2值
  • 计数(1000-1M)=> 2倍的值
+0

对于必须使用准备好的语句桶的动态数量。 –

+0

你能指点我一个例子吗? –

+0

@GiorgosBetsos我看不出这是'动态'。范围似乎是手动构建的。相反,它*是动态的,我不明白为什么会使用准备好的语句 - 虽然我接受这将是一个解决方案。 – Strawberry

回答

2

如果上限小于1M,也许你可以根据你的样本数据尝试count(case when ... then .. end)和期望的结果:

select 
    count(case when col between 0 and 9 then 1 end) `bucket(0-9)`, 
    count(case when col between 10 and 99 then 1 end) `bucket(10-99)`, 
    count(case when col between 100 and 999 then 1 end) `bucket(100-999)`, 
    count(case when col between 1000 and 1000000 then 1 end) `bucket(1000-1M)` 
from test 

检查demo在SQLFiddle中。

+0

太棒了。我会试试看! –

+0

是1M的上限重要 –

+0

如果您有另一个间隔超过1M,则应该添加另一个“count”。 – Blank

0

这里的另一个想法一起玩......

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table (i INT NOT NULL PRIMARY KEY); 

INSERT INTO my_table VALUES 
(1), 
(2), 
(10), 
(15), 
(20), 
(100), 
(150), 
(1000), 
(10000); 

SELECT LENGTH(i) bucket 
    , CONCAT(RPAD(1,LENGTH(i),0),'-',RPAD(9,LENGTH(i),9)) range 
    , COUNT(*) total 
    FROM my_table 
GROUP 
    BY bucket; 
+--------+-------------+-------+ 
| bucket | range  | total | 
+--------+-------------+-------+ 
|  1 | 1-9   |  2 | 
|  2 | 10-99  |  3 | 
|  3 | 100-999  |  2 | 
|  4 | 1000-9999 |  1 | 
|  5 | 10000-99999 |  1 | 
+--------+-------------+-------+ 
相关问题