MYSQL - 如何根据范围对数据进行分组并计数
问题描述:
我正在寻找一种将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倍的值
答
如果上限小于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中。
答
这里的另一个想法一起玩......
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 |
+--------+-------------+-------+
对于必须使用准备好的语句桶的动态数量。 –
你能指点我一个例子吗? –
@GiorgosBetsos我看不出这是'动态'。范围似乎是手动构建的。相反,它*是动态的,我不明白为什么会使用准备好的语句 - 虽然我接受这将是一个解决方案。 – Strawberry