如何对小数数据集按自定义范围分组并实现聚合计数(无需临时表)
小数列表按指定范围分组统计的实现方案
不用临时表的话,可通过嵌套子查询直接实现,核心思路是先计算数据集的关键参数,再给每个数值分配所属组,最后生成区间并统计数量。
示例SQL(以MySQL为例)
假设数据存在表nums的value列中,指定除数为2:
SELECT ROUND(CASE WHEN grp = 0 THEN 0 ELSE grp * s.step + 0.01 END, 2) AS RangeStart, ROUND(CASE WHEN grp = s.divisor - 1 THEN s.max_val ELSE (grp + 1) * s.step END, 2) AS RangeEnd, COUNT(*) AS Count FROM ( SELECT value, LEAST(FLOOR(value / s.step), s.divisor - 1) AS grp FROM nums, (SELECT MAX(value) AS max_val, ROUND(MAX(value)/2, 2) AS step, 2 AS divisor FROM nums) s ) t GROUP BY grp, s.step, s.max_val, s.divisor ORDER BY grp;
逻辑拆解
计算基础参数:内层子查询
s算出三个核心值max_val:数据集最大值,保证区间上限覆盖所有数据step:每组区间长度,由最大值/除数计算并保留两位小数divisor:你指定的分组数量除数
分配组号:中间层子查询
t给每个数值打组标签- 用
FLOOR(value/step)算出基础组号 - 用
LEAST确保最大值不会超出预设分组数(比如除数为2时,组号只能是0或1)
- 用
生成区间并统计:外层查询完成最终输出
- 第一组起始为0,结束为
step - 后续组起始为上一组结束值+0.01(避免区间重叠),结束为
(组号+1)*step - 最后一组直接用数据集最大值做结束,规避浮点计算误差
- 统计每组的数值数量
- 第一组起始为0,结束为
适配你的示例数据集
输入数据:150.75、250.01、600.10、900.50,除数为2时,执行上述SQL会得到:
| RangeStart | RangeEnd | Count |
|---|---|---|
| 0.00 | 450.25 | 2 |
| 450.26 | 900.50 | 2 |
(注:你提供的示例中第二组结束值为1000属于笔误,实际会以数据集最大值900.50作为区间上限;若需要向上取整到整数,可将MAX(value)替换为CEIL(MAX(value)))
灵活调整
- 修改子查询
s中的divisor值即可改变分组数量,比如除数为3时会分成3组 - 调整
ROUND函数的小数位数,可匹配你的数据精度需求
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

