mysql - 如何根据列值创建 MySQL 直方图类型的桶
问题描述
我有下表,我正在尝试通过 MySQL 创建直方图样式的存储桶。
| Id | Values |
| -------- | --------- |
| 1 | 5 |
| 2 | 7 |
| 3 | 9 |
| 4 | 11 |
| 5 | 15 |
| 6 | 31 |
| 7 | 32 |
| 8 | 43 |
我想要实现的目标如下:
| bucket | count |
| -------- | --------- |
| 0-9 | 3 |
| 10-19 | 2 |
| 20-29 | 0 |
| 30-39 | 2 |
| 40-49 | 1 |
有谁知道我们如何以干净的方式得到这个?
解决方案
一种可能的方法是为存储桶列表创建一个参考表,然后LEFT JOIN
将其与您的表一起创建。尝试以下步骤。
- 例如创建一个表
bucket_list
:
CREATE TABLE bucket_list (
id INT NOT NULL AUTO_INCREMENT,
startno INT,
endno INT,
PRIMARY KEY(id));
- 将值插入
bucket_list
:
INSERT INTO bucket_list (startno, endno)
VALUES
(0, 9),
(10, 19),
(20, 29),
(30, 39),
(40, 49),
(50, 59),
(60, 69),
(70, 79);
- 创建查询以返回预期结果:
SELECT CONCAT(a.startno,'-',a.endno) AS bucket,
SUM(CASE WHEN b.val IS NULL THEN 0 ELSE 1 END) AS COUNT
FROM bucket_list a
LEFT JOIN mytable b ON b.val BETWEEN a.startno AND a.endno
GROUP BY bucket;
这是一个小提琴:https ://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=7fee426efa2b1f1e39377bb7beb68b62
推荐阅读
- c - 源文件之间的最佳功能划分
- jsp - request.getParameter() 在提交按钮上返回 null
- java - weblogic.application.ModuleException:java.io.FileNotFoundException
- java - Android Studio 布局被压缩
- api - 在 golang 中以编程方式访问 RPM api/调用
- java - 具有可变维度的参数
- php - 为页面设置特定的持续时间
- reactjs - 我如何将组件引用传递给 redux 商店
- laravel - 我应该在 Laravel 的多个模型中使用什么雄辩的关系
- reactjs - 使用 Graphql、React 映射函数