如何使用MySQL对数值按10000步长分桶且桶编号从0开始?
实现方案
你原来的写法得到100、101这类结果是因为没有减去起始值对应的偏移量,按如下逻辑编写SQL即可满足需求:
- 桶编号计算:先减去分桶起始值
1000000再除以间隔10000后取整,即可得到从0开始的桶号 - 区间范围计算:通过桶号反推区间左右边界,再拼接为字符串即可
通用SQL写法(兼容大多数SQL引擎,如MySQL、PostgreSQL、Hive等)
SELECT distance, FLOOR((distance - 1000000)/10000) AS bucket, CONCAT( 1000000 + FLOOR((distance - 1000000)/10000)*10000, ' - ', 1000000 + FLOOR((distance - 1000000)/10000)*10000 + 9999 ) AS `range` FROM data;
简化写法(使用CTE避免重复计算,逻辑更清晰)
WITH bucket_temp AS ( SELECT distance, FLOOR((distance - 1000000)/10000) AS bucket FROM data ) SELECT distance, bucket, CONCAT(1000000 + bucket*10000, ' - ', 1000000 + bucket*10000 + 9999) AS `range` FROM bucket_temp;
补充说明
如果存在小于1000000的distance值,会得到负数的桶编号,若不需要这类数据可在查询中添加WHERE distance >= 1000000过滤即可。
内容的提问来源于stack exchange,提问作者trillion
相关产品推荐
相关产品推荐

