HISTOGRAM 函数是 TDengine 中的一个聚合函数,用于对数值数据进行直方图统计分析。它将数据按照指定的区间(bins)进行分组统计,返回每个区间内数据的数量分布,帮助用户理解数据的分布特征。
HISTOGRAM(expr, bin_type, bin_desc, normalized)
参数 | 类型 | 必需 | 描述 |
---|---|---|---|
expr |
数值类型 | 是 | 要进行直方图分析的字段或表达式,支持所有数值类型(整型、浮点型、无符号整型等) |
bin_type |
STRING | 是 | 分箱类型,支持三种类型: - 'user_input' :用户自定义分箱- 'linear_bin' :线性等距分箱- 'log_bin' :对数分箱 |
bin_desc |
STRING | 是 | 分箱描述,格式依据 bin_type 而定,详见下文 |
normalized |
INT | 是 | 标准化标志,取值为 0 或 1: - 0 :返回绝对计数- 1 :返回归一化百分比(总和为1) |
STRING - 返回 JSON 格式的字符串,包含每个区间的统计信息。
用户直接指定分箱边界点。
bin_desc 格式:
[边界点1, 边界点2, 边界点3, ...]
要求:
示例:
-- 将数据分为3个区间:(0,3]、(3,6]、(6,9]
SELECT HISTOGRAM(c_int, 'user_input', '[0,3,6,9]', 0) FROM table_name;
按照线性等距方式自动生成分箱。
bin_desc 格式:
{
"start": 起始值,
"width": 区间宽度,
"count": 区间数量,
"infinity": 是否包含无穷区间
}
参数说明:
start
:第一个区间的起始值width
:每个区间的宽度,不能为0count
:要生成的区间数量,范围 [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;
按照对数比例生成分箱,适用于具有指数分布特征的数据。
bin_desc 格式:
{
"start": 起始值,
"factor": 倍数因子,
"count": 区间数量,
"infinity": 是否包含无穷区间
}
参数说明:
start
:第一个区间的起始值,不能为0factor
:倍数因子,必须大于0且不等于1count
:要生成的区间数量,范围 [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时)
}
分析数据的分布特征,识别数据的集中趋势和离散程度。
-- 分析温度数据的分布
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';
通过直方图识别数据中的异常值或异常模式。
-- 检测响应时间的异常分布
SELECT HISTOGRAM(response_time, 'log_bin',
'{"start": 1, "factor": 2, "count": 10, "infinity": true}', 0)
FROM api_logs
WHERE ts >= NOW() - INTERVAL 1 DAY;
分析系统性能指标的分布情况,如响应时间、CPU使用率等。
-- 分析CPU使用率分布
SELECT HISTOGRAM(cpu_usage, 'user_input', '[0,20,40,60,80,100]', 1)
FROM system_metrics
WHERE ts >= NOW() - INTERVAL 1 HOUR;
对业务数据进行统计分析,如订单金额分布、用户年龄分布等。
-- 分析订单金额分布
SELECT HISTOGRAM(order_amount, 'linear_bin',
'{"start": 0, "width": 100, "count": 50, "infinity": false}', 1)
FROM orders
WHERE order_date >= '2024-01-01';
参数限制:
count
参数范围:[1, 1000]factor
必须大于0且不等于1width
不能为0start
不能为0数据类型限制:
expr
必须是数值类型函数组合限制:
选择合适的分箱类型:
linear_bin
log_bin
user_input
合理设置区间数量:
标准化的使用:
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;
normalized=1
时,所有区间的 count 值总和为1(除非所有数据都为NULL)infinity=true
时,会自动添加边界区间处理极值