当前位置: 首页 > news >正文

TDengine 的 HISTOGRAM() 函数用户手册

在这里插入图片描述

HISTOGRAM 函数用户使用手册

概述

HISTOGRAM 函数是 TDengine 中的一个聚合函数,用于对数值数据进行直方图统计分析。它将数据按照指定的区间(bins)进行分组统计,返回每个区间内数据的数量分布,帮助用户理解数据的分布特征。

语法

HISTOGRAM(expr, bin_type, bin_desc, normalized)

参数说明

参数类型必需描述
expr数值类型要进行直方图分析的字段或表达式,支持所有数值类型(整型、浮点型、无符号整型等)
bin_typeSTRING分箱类型,支持三种类型:
- 'user_input':用户自定义分箱
- 'linear_bin':线性等距分箱
- 'log_bin':对数分箱
bin_descSTRING分箱描述,格式依据 bin_type 而定,详见下文
normalizedINT标准化标志,取值为 0 或 1:
- 0:返回绝对计数
- 1:返回归一化百分比(总和为1)

返回值类型

STRING - 返回 JSON 格式的字符串,包含每个区间的统计信息。

分箱类型详解

1. 用户自定义分箱 (user_input)

用户直接指定分箱边界点。

bin_desc 格式

[边界点1, 边界点2, 边界点3, ...]

要求

  • 边界点必须是数值类型
  • 边界点必须严格递增
  • 至少包含2个边界点
  • 生成的区间数量 = 边界点数量 - 1

示例

-- 将数据分为3个区间:(0,3]、(3,6]、(6,9]
SELECT HISTOGRAM(c_int, 'user_input', '[0,3,6,9]', 0) FROM table_name;
2. 线性等距分箱 (linear_bin)

按照线性等距方式自动生成分箱。

bin_desc 格式

{"start": 起始值,"width": 区间宽度,"count": 区间数量,"infinity": 是否包含无穷区间
}

参数说明

  • start:第一个区间的起始值
  • width:每个区间的宽度,不能为0
  • count:要生成的区间数量,范围 [1, 1000]
  • infinity:布尔值,true时会在两端添加 (-∞, start] 和 (last, +∞) 区间

示例

-- 生成5个区间:(-∞,0]、(0,10]、(10,20]、(20,30]、(30,40]、(40,+∞)
SELECT HISTOGRAM(c_int, 'linear_bin', '{"start": 0, "width": 10, "count": 4, "infinity": true}', 1) 
FROM table_name;
3. 对数分箱 (log_bin)

按照对数比例生成分箱,适用于具有指数分布特征的数据。

bin_desc 格式

{"start": 起始值,"factor": 倍数因子,"count": 区间数量,"infinity": 是否包含无穷区间
}

参数说明

  • start:第一个区间的起始值,不能为0
  • factor:倍数因子,必须大于0且不等于1
  • count:要生成的区间数量,范围 [1, 1000]
  • infinity:布尔值,控制是否添加无穷区间

生成规则:第 i 个边界点 = start × factor^i

示例

-- 生成对数分箱:(1,2]、(2,8]、(8,32]、(32,128]
SELECT HISTOGRAM(c_float, 'log_bin', '{"start": 1, "factor": 4, "count": 4, "infinity": false}', 0) 
FROM table_name;

输出格式

函数返回 JSON 格式的字符串数组,每个元素包含:

{"lower_bin": 区间下界,"upper_bin": 区间上界, "count": 该区间内的数据量(normalized=0)或百分比(normalized=1)
}

使用场景

1. 数据分布分析

分析数据的分布特征,识别数据的集中趋势和离散程度。

-- 分析温度数据的分布
SELECT HISTOGRAM(temperature, 'linear_bin', '{"start": -10, "width": 5, "count": 20, "infinity": true}', 1) 
FROM sensor_data 
WHERE ts >= '2024-01-01' AND ts < '2024-02-01';
2. 异常检测

通过直方图识别数据中的异常值或异常模式。

-- 检测响应时间的异常分布
SELECT HISTOGRAM(response_time, 'log_bin', '{"start": 1, "factor": 2, "count": 10, "infinity": true}', 0) 
FROM api_logs 
WHERE ts >= NOW() - INTERVAL 1 DAY;
3. 性能分析

分析系统性能指标的分布情况,如响应时间、CPU使用率等。

-- 分析CPU使用率分布
SELECT HISTOGRAM(cpu_usage, 'user_input', '[0,20,40,60,80,100]', 1) 
FROM system_metrics 
WHERE ts >= NOW() - INTERVAL 1 HOUR;
4. 业务指标分析

对业务数据进行统计分析,如订单金额分布、用户年龄分布等。

-- 分析订单金额分布
SELECT HISTOGRAM(order_amount, 'linear_bin', '{"start": 0, "width": 100, "count": 50, "infinity": false}', 1) 
FROM orders 
WHERE order_date >= '2024-01-01';

解决的问题

  1. 数据分布可视化:将连续数值数据离散化,便于理解数据分布特征
  2. 统计分析支持:为后续的统计分析和机器学习提供数据预处理
  3. 异常值识别:通过分布分析快速定位异常数据
  4. 性能监控:实时监控系统性能指标的分布变化
  5. 业务洞察:通过数据分布分析获得业务洞察

使用限制

  1. 参数限制

    • count 参数范围:[1, 1000]
    • factor 必须大于0且不等于1
    • width 不能为0
    • 对数分箱的 start 不能为0
  2. 数据类型限制

    • expr 必须是数值类型
    • 不支持字符串、布尔值、时间戳类型
  3. 函数组合限制

    • 不能与其他聚合函数嵌套使用
    • 不能在 WHERE、GROUP BY、PARTITION BY 子句中使用其他聚合函数

适用范围

  • 表类型:支持普通表和超级表
  • 嵌套查询:支持内层查询和外层查询
  • 版本要求:TDengine 3.0+

最佳实践

  1. 选择合适的分箱类型

    • 均匀分布数据:使用 linear_bin
    • 指数分布数据:使用 log_bin
    • 特定业务需求:使用 user_input
  2. 合理设置区间数量

    • 一般建议10-50个区间
    • 数据量大时可适当增加区间数
  3. 标准化的使用

    • 比较不同数据集时使用 normalized=1
    • 关注绝对数量时使用 normalized=0

示例应用

-- 示例1:用户自定义分箱分析温度分布
SELECT HISTOGRAM(temperature, 'user_input', '[-10,0,10,20,30,40]', 1) 
FROM weather_data 
WHERE city='Beijing' AND date >= '2024-01-01';-- 示例2:线性分箱分析订单金额
SELECT HISTOGRAM(amount, 'linear_bin', '{"start": 0, "width": 50, "count": 20, "infinity": true}', 0) 
FROM orders 
WHERE created_time >= NOW() - INTERVAL 7 DAY;-- 示例3:对数分箱分析响应时间
SELECT HISTOGRAM(latency_ms, 'log_bin', '{"start": 1, "factor": 2, "count": 15, "infinity": true}', 1) 
FROM api_requests 
WHERE endpoint='/api/data' AND ts >= NOW() - INTERVAL 1 DAY;

注意事项

  1. 返回结果按区间顺序排列
  2. 区间采用左开右闭原则:(lower, upper]
  3. NULL 值会被自动忽略
  4. normalized=1 时,所有区间的 count 值总和为1(除非所有数据都为NULL)
  5. 使用 infinity=true 时,会自动添加边界区间处理极值
http://www.lryc.cn/news/596884.html

相关文章:

  • 解决Spring事务中RPC调用无法回滚的问题
  • 解构未来金融:深入剖析DeFi与去中心化交易所(DEX)的技术架构
  • 【音视频学习】五、深入解析视频技术中的像素格式:颜色空间、位深度、存储布局
  • LoRA 低秩矩阵实现参数高效的权重更新
  • 新手向:Pycharm的使用技巧
  • python3写一个异步http接口服务调用大模型(async, sanic)---6.1
  • Hexo - 免费搭建个人博客04 - 创建另一个私人仓库,对Hexo项目进行版本管理
  • Log4j CVE-2021-44228 漏洞复现详细教程
  • Sklearn 机器学习 线性回归
  • 20250704-基于强化学习在云计算环境中的虚拟机资源调度研究
  • OpenCV 零基础到项目实战 | DAY 2:图像预处理全解析
  • 基于Seata的微服务分布式事务实战经验分享
  • 7月23号打卡
  • 四、cv::Mat的介绍和使用
  • 【趣味解读】淘宝登录的前后端交互机制:Cookie-Session 如何保障你的账户安全?
  • 密码学中的概率论与统计学:从频率分析到现代密码攻击
  • 从8h到40min的极致并行优化:Spark小数据集UDTF处理的深度实践与原理剖析
  • 通用图片 OCR 到 Word API 数据接口
  • AI黑科技:GAN如何生成逼真人脸
  • Jquery、Vue 、Ajax、axios、Fetch区别
  • 微算法科技(NASDAQ: MLGO)研究量子机器学习算法 (Quantum Machine Learning Algorithms),加速机器学习任务
  • 【OpenCV篇】OpenCV——02day.图像预处理(1)
  • 基于Trae IDE与MCP实现网页自动化测试的最佳实践
  • 神经网络和机器学习的一些基本概念
  • CLI 与 IDE 编码代理比较:提升开发效率的两种路径
  • PDF转Word的简单方法
  • Fluent许可与硬件绑定的解决方法
  • 2027.7.23深搜算法复习总结
  • Semantic Kernel实现调用Kernel Memory
  • 多模态Embedding技术