Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL-如何根据范围对数据进行分组和计数_Mysql_Plot_Group By_Count - Fatal编程技术网

MYSQL-如何根据范围对数据进行分组和计数

MYSQL-如何根据范围对数据进行分组和计数,mysql,plot,group-by,count,Mysql,Plot,Group By,Count,我正在寻找一种方法,将MYSql数据分组到bucket(值的范围)中,然后计算每个组中有多少个值,然后将其绘制在图形上 我有很多范围,不是很少像这里,我会做手动 例如,如果我的数据如下所示: +--------+ | column | +--------+ | 1 | | 2 | | 10 | | 15 | | 20 | | 100 | | 150 | | 1000 | | 10000 | +--------+ 我可以创建bucke

我正在寻找一种方法,将MYSql数据分组到bucket(值的范围)中,然后计算每个组中有多少个值,然后将其绘制在图形上

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

例如,如果我的数据如下所示:

+--------+
| column |
+--------+
|      1 |
|      2 |
|     10 |
|     15 |
|     20 |
|    100 |
|    150 |
|   1000 |
|  10000 |
+--------+
我可以创建bucket并计算每个bucket中的值的数量:

+-------------+---------------+-----------------+-----------------+
| 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,也许您可以根据样本数据和所需结果尝试计数(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

检查SQLFIDLE中的

如果上限小于1M,您可以尝试
计数(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

检查SQLFIDLE中的

这里有另一个可以使用的想法

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

这里有另一个玩法

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

对于动态数量的bucket,您必须使用准备好的语句。您能给我指出一个example@GiorgosBetsos我看不出这是什么意义上的“动态”。该范围似乎是手动构建的。相反,它是动态的,我不明白为什么需要使用准备好的语句——尽管我承认这是一种解决方案。对于动态数量的桶,你必须使用准备好的语句。你能给我指出一个example@GiorgosBetsos我看不出这是什么意义上的“动态”。该范围似乎是手动构建的。相反,它是动态的,我不明白为什么需要使用事先准备好的声明——尽管我承认这是一个解决方案。太好了。我试试看!1M上限是否重要?如果您的间隔超过1M,则需要添加另一个
count
。太好了。我试试看!1M上限是否重要?如果您有另一个大于1M的间隔,则需要添加另一个
count