
VAR_SAMP 函数
1. 函数概述
1.1 功能说明
VAR_SAMP 函数用于计算数据集的样本方差 (Sample Variance),是统计分析中衡量数据离散程度的重要指标。与 VARIANCE(总体方差)不同,样本方差使用 n-1 作为除数,适用于从总体中抽取的样本数据分析场景。
计算公式:
VAR_SAMP ( X ) = ∑ i = 1 n ( x i − x ˉ ) 2 n − 1 \text{VAR\SAMP}(X) = \frac{\sum{i=1}^{n}(x_i - \bar{x})^2}{n-1} VAR_SAMP(X)=n−1∑i=1n(xi−xˉ)2
其中:
- x i x_i xi 为每个数据点
- x ˉ \bar{x} xˉ 为样本均值
- n n n 为样本数量
- n − 1 n-1 n−1 为自由度(贝塞尔校正)
1.2 语法
sql
VAR_SAMP(expr)
1.3 参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| expr | 数值类型 | 要计算样本方差的数值列 |
1.4 返回值
- 类型:DOUBLE
- 说明:返回指定列的样本方差值
- 当样本数量为 0 时,返回 NULL
- 当样本数量为 1 时,返回 0.0(因为 n-1=0)
- 结果为 NaN 或 Infinity 时返回 NULL
1.5 适用版本
自 TDengine v3.3.8.0 开始支持
1.6 适用范围
- ✅ 普通表
- ✅ 超级表
- ✅ 支持嵌套查询
- ✅ 可与 GROUP BY、窗口查询结合使用
2. VAR_SAMP 与 VARIANCE 的区别
2.1 核心差异
| 对比项 | VAR_SAMP(样本方差) | VARIANCE(总体方差) |
|---|---|---|
| 计算公式 | ∑ ( x i − x ˉ ) 2 n − 1 \frac{\sum(x_i - \bar{x})^2}{n-1} n−1∑(xi−xˉ)2 | ∑ ( x i − x ˉ ) 2 n \frac{\sum(x_i - \bar{x})^2}{n} n∑(xi−xˉ)2 |
| 除数 | n - 1(贝塞尔校正) | n |
| 适用场景 | 样本数据推断总体 | 总体数据的实际方差 |
| 结果大小 | 通常较大 | 通常较小 |
| 统计意义 | 无偏估计 | 有偏估计 |
2.2 何时使用 VAR_SAMP
- ✅ 抽样调查:从所有电表中抽取部分电表的数据
- ✅ 质量控制:对生产线的样本数据进行检测
- ✅ 数据推断:需要从样本推断总体特性
- ✅ 科学研究:实验数据通常是样本数据
2.3 何时使用 VARIANCE
- ✅ 完整数据集:已有全部电表的全部数据
- ✅ 描述性统计:仅描述当前数据集的特征
- ✅ 监控指标:实时监控当前时段的数据波动
3. 基础使用示例
3.1 智能电表表结构
sql
-- 创建智能电表超级表
CREATE STABLE meters (
ts TIMESTAMP,
current FLOAT,
voltage INT,
phase FLOAT
) TAGS (
groupid INT,
location VARCHAR(64)
);
-- 创建子表并插入测试数据
CREATE TABLE d1001 USING meters TAGS (1, 'Beijing.Chaoyang');
CREATE TABLE d1002 USING meters TAGS (1, 'Beijing.Haidian');
INSERT INTO d1001 VALUES
('2024-01-15 00:00:00', 10.2, 220, 0.95),
('2024-01-15 06:00:00', 12.5, 221, 0.96),
('2024-01-15 12:00:00', 15.8, 219, 0.94),
('2024-01-15 18:00:00', 18.3, 222, 0.97),
('2024-01-15 23:00:00', 11.6, 220, 0.95);
INSERT INTO d1002 VALUES
('2024-01-15 00:00:00', 9.8, 219, 0.93),
('2024-01-15 06:00:00', 11.2, 220, 0.95),
('2024-01-15 12:00:00', 14.5, 218, 0.92),
('2024-01-15 18:00:00', 17.1, 221, 0.96),
('2024-01-15 23:00:00', 10.9, 219, 0.94);
3.2 单表样本方差计算
sql
-- 计算单个电表的电流样本方差
SELECT VAR_SAMP(current) AS current_var_samp
FROM d1001
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00';
预期输出:
current_var_samp |
====================
11.7575 |
业务含义:该电表当日电流样本方差为 11.76,说明电流波动较大,如果这是从较长时间序列中抽取的样本,可以用此值推断总体的电流波动情况。
3.3 对比样本方差与总体方差
sql
-- 同时计算样本方差和总体方差
SELECT
ROUND(VAR_SAMP(current), 3) AS sample_variance,
ROUND(VARIANCE(current), 3) AS population_variance,
ROUND((VAR_SAMP(current) - VARIANCE(current)) / VARIANCE(current) * 100, 2) AS diff_percent
FROM d1001
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00';
预期输出:
sample_variance | population_variance | diff_percent |
============================================================
11.758 | 9.406 | 25.00 |
业务含义:样本方差比总体方差大约 25%,这是因为样本方差使用 n-1 作为除数,提供了更保守的估计。
4. 智能电表应用场景
场景 1:区域用电负荷波动性抽样分析
业务需求:从不同区域随机抽取部分电表,评估各区域的用电负荷波动性,推断整体特征。
sql
-- 按区域统计样本电流方差(抽样分析)
SELECT
SUBSTRING_INDEX(location, '.', 1) AS region,
COUNT(*) AS sample_size,
ROUND(AVG(current), 2) AS avg_current,
ROUND(VAR_SAMP(current), 3) AS current_var_samp,
ROUND(STDDEV_SAMP(current), 3) AS current_stddev_samp
FROM meters
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00'
AND groupid = 1 -- 抽样组
GROUP BY region
ORDER BY current_var_samp DESC;
预期输出:
region | sample_size | avg_current | current_var_samp | current_stddev_samp |
====================================================================================
Beijing | 10 | 13.19 | 10.847 | 3.294 |
业务价值:
- 通过抽样电表数据推断整个区域的负荷波动特征
- 样本方差提供无偏估计,更适合推断总体
- 识别需要重点监控的高波动区域
场景 2:电压质量稳定性样本检测
业务需求:对每日随机时段的电压数据进行抽样检测,评估供电质量稳定性。
sql
-- 分时段计算电压样本方差
SELECT
tbname AS meter_id,
HOUR(ts) AS hour_of_day,
COUNT(*) AS sample_count,
ROUND(AVG(voltage), 1) AS avg_voltage,
ROUND(VAR_SAMP(voltage), 3) AS voltage_var_samp,
CASE
WHEN VAR_SAMP(voltage) > 2.5 THEN '不稳定'
WHEN VAR_SAMP(voltage) > 1.0 THEN '一般'
ELSE '稳定'
END AS stability_level
FROM meters
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00'
GROUP BY tbname, HOUR(ts)
HAVING sample_count >= 3 -- 至少3个样本
ORDER BY voltage_var_samp DESC
LIMIT 10;
预期输出:
meter_id | hour_of_day | sample_count | avg_voltage | voltage_var_samp | stability_level |
================================================================================================
d1001 | 18 | 3 | 221.0 | 3.000 | 不稳定 |
d1002 | 12 | 3 | 219.3 | 2.333 | 一般 |
业务价值:
- 通过样本方差评估电压质量稳定性
- 识别电压波动异常的时段
- 为供电质量改善提供数据支撑
场景 3:功率因数一致性样本评估
业务需求:从历史数据中抽取样本,评估不同电表的功率因数一致性,识别异常电表。
sql
-- 计算各电表功率因数样本方差,识别异常设备
SELECT
tbname AS meter_id,
location,
COUNT(*) AS sample_size,
ROUND(AVG(phase), 4) AS avg_phase,
ROUND(VAR_SAMP(phase), 6) AS phase_var_samp,
ROUND(STDDEV_SAMP(phase), 6) AS phase_stddev_samp,
-- 变异系数 (CV) = 标准差 / 均值
ROUND(STDDEV_SAMP(phase) / AVG(phase) * 100, 2) AS cv_percent
FROM meters
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00'
GROUP BY tbname, location
HAVING sample_size >= 5
ORDER BY phase_var_samp DESC
LIMIT 5;
预期输出:
meter_id | location | sample_size | avg_phase | phase_var_samp | phase_stddev_samp | cv_percent |
==============================================================================================================
d1001 | Beijing.Chaoyang | 5 | 0.9540 | 0.000143 | 0.011958 | 1.25 |
d1002 | Beijing.Haidian | 5 | 0.9400 | 0.000250 | 0.015811 | 1.68 |
业务价值:
- 样本数据推断设备长期运行稳定性
- CV(变异系数)量化相对波动程度
- 识别需要维护的异常设备
场景 4:时间窗口负荷波动样本分析
业务需求:使用滑动窗口对负荷数据进行抽样分析,识别波动趋势。
sql
-- 按小时窗口计算电流样本方差
SELECT
_wstart AS window_start,
COUNT(*) AS sample_count,
ROUND(AVG(current), 2) AS avg_current,
ROUND(VAR_SAMP(current), 3) AS current_var_samp,
ROUND(STDDEV_SAMP(current), 3) AS current_stddev_samp
FROM meters
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00'
AND location LIKE 'Beijing%'
INTERVAL(6h)
ORDER BY window_start;
预期输出:
window_start | sample_count | avg_current | current_var_samp | current_stddev_samp |
==================================================================================================
2024-01-15 00:00:00 | 4 | 10.925 | 1.163 | 1.078 |
2024-01-15 06:00:00 | 4 | 13.775 | 2.635 | 1.623 |
2024-01-15 12:00:00 | 4 | 16.425 | 3.229 | 1.797 |
2024-01-15 18:00:00 | 4 | 13.725 | 11.929 | 3.454 |
业务价值:
- 识别一天中不同时段的负荷波动模式
- 样本方差反映各时段的用电不确定性
- 为负荷预测和调度提供参考
场景 5:跨区域负荷方差比较(样本分析)
业务需求:对比不同区域的抽样数据,评估区域间负荷特征差异。
sql
-- 对比不同区域的样本统计特征
WITH regional_stats AS (
SELECT
SUBSTRING_INDEX(location, '.', 1) AS region,
tbname,
VAR_SAMP(current) AS meter_var_samp,
AVG(current) AS meter_avg_current
FROM meters
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00'
GROUP BY region, tbname
)
SELECT
region,
COUNT(*) AS meter_sample_count,
ROUND(AVG(meter_avg_current), 2) AS region_avg_current,
ROUND(AVG(meter_var_samp), 3) AS avg_meter_var_samp,
ROUND(VAR_SAMP(meter_avg_current), 3) AS region_current_var_samp,
-- 组内方差占总方差的比例
ROUND(AVG(meter_var_samp) / (AVG(meter_var_samp) + VAR_SAMP(meter_avg_current)) * 100, 2) AS within_group_pct
FROM regional_stats
GROUP BY region
ORDER BY avg_meter_var_samp DESC;
预期输出:
region | meter_sample_count | region_avg_current | avg_meter_var_samp | region_current_var_samp | within_group_pct |
===========================================================================================================================
Beijing | 2 | 13.19 | 11.303 | 0.288 | 97.52 |
业务价值:
- 分层分析:区分电表内部波动和区域间差异
- 样本方差适用于推断区域总体特征
- 为区域电网优化提供数据依据
场景 6:负荷预测误差方差分析(样本数据)
业务需求:评估从历史数据中抽取的样本的预测误差波动,优化预测模型。
sql
-- 分析不同时段的样本负荷预测误差方差
SELECT
HOUR(ts) AS hour_of_day,
COUNT(*) AS sample_count,
ROUND(AVG(current), 2) AS actual_avg_current,
-- 假设预测值为历史均值
ROUND(VAR_SAMP(current - (SELECT AVG(current) FROM meters)), 3) AS prediction_error_var_samp,
ROUND(STDDEV_SAMP(current), 3) AS current_stddev_samp
FROM meters
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00'
AND location LIKE 'Beijing%'
GROUP BY HOUR(ts)
HAVING sample_count >= 2
ORDER BY hour_of_day;
预期输出:
hour_of_day | sample_count | actual_avg_current | prediction_error_var_samp | current_stddev_samp |
==========================================================================================================
0 | 2 | 10.00 | 0.080 | 0.283 |
6 | 2 | 11.85 | 0.845 | 0.919 |
12 | 2 | 15.15 | 0.845 | 0.919 |
18 | 2 | 17.70 | 0.720 | 0.849 |
23 | 2 | 11.25 | 0.245 | 0.495 |
业务价值:
- 量化预测模型在不同时段的不确定性
- 样本方差提供预测误差的无偏估计
- 指导模型优化和置信区间设定
5. 与其他统计函数的配合使用
5.1 样本标准差与样本方差
sql
-- 同时计算样本方差和样本标准差
SELECT
tbname AS meter_id,
ROUND(VAR_SAMP(current), 3) AS current_var_samp,
ROUND(STDDEV_SAMP(current), 3) AS current_stddev_samp,
-- 验证关系:STDDEV_SAMP = SQRT(VAR_SAMP)
ROUND(SQRT(VAR_SAMP(current)), 3) AS calculated_stddev
FROM meters
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00'
GROUP BY tbname;
预期输出:
meter_id | current_var_samp | current_stddev_samp | calculated_stddev |
===========================================================================
d1001 | 11.758 | 3.429 | 3.429 |
d1002 | 10.848 | 3.294 | 3.294 |
5.2 总体方差与样本方差对比
sql
-- 对比四种方差/标准差函数
SELECT
location,
COUNT(*) AS n,
ROUND(VARIANCE(current), 3) AS var_pop,
ROUND(VAR_SAMP(current), 3) AS var_samp,
ROUND(STDDEV(current), 3) AS stddev_pop,
ROUND(STDDEV_SAMP(current), 3) AS stddev_samp,
-- 计算偏差校正系数
ROUND(VAR_SAMP(current) / VARIANCE(current), 4) AS bessel_correction_factor
FROM meters
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00'
GROUP BY location;
预期输出:
location | n | var_pop | var_samp | stddev_pop | stddev_samp | bessel_correction_factor |
============================================================================================================
Beijing.Chaoyang | 5 | 9.406 | 11.758 | 3.067 | 3.429 | 1.2500 |
Beijing.Haidian | 5 | 8.678 | 10.848 | 2.946 | 3.294 | 1.2500 |
说明:贝塞尔校正系数 = n/(n-1),当 n=5 时为 1.25
6. 性能优化建议
6.1 查询优化
sql
-- ❌ 不推荐:多次查询
SELECT VAR_SAMP(current) FROM meters WHERE location = 'Beijing.Chaoyang';
SELECT VAR_SAMP(voltage) FROM meters WHERE location = 'Beijing.Chaoyang';
-- ✅ 推荐:单次查询多个指标
SELECT
VAR_SAMP(current) AS current_var_samp,
VAR_SAMP(voltage) AS voltage_var_samp,
VAR_SAMP(phase) AS phase_var_samp
FROM meters
WHERE location = 'Beijing.Chaoyang';
6.2 时间范围控制
sql
-- ✅ 推荐:限定时间范围
SELECT VAR_SAMP(current)
FROM meters
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00'
AND location = 'Beijing.Chaoyang';
6.3 合理使用窗口查询
sql
-- 使用 INTERVAL 进行时间窗口聚合
SELECT
_wstart,
VAR_SAMP(current) AS current_var_samp
FROM meters
WHERE ts >= '2024-01-01' AND ts < '2024-01-31'
INTERVAL(1d)
ORDER BY _wstart;
7. 最佳实践
7.1 样本数量检查
sql
-- 确保样本量充足
SELECT
tbname,
COUNT(*) AS sample_size,
CASE
WHEN COUNT(*) < 2 THEN NULL -- 样本量不足
ELSE VAR_SAMP(current)
END AS valid_var_samp
FROM meters
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00'
GROUP BY tbname
HAVING sample_size >= 2; -- 至少需要 2 个样本
7.2 异常值处理
sql
-- 过滤异常值后计算样本方差
WITH filtered_data AS (
SELECT
tbname,
current,
ts
FROM meters
WHERE ts >= '2024-01-15 00:00:00'
AND ts < '2024-01-16 00:00:00'
AND current BETWEEN 0 AND 100 -- 过滤异常值
AND voltage BETWEEN 180 AND 250
)
SELECT
tbname,
COUNT(*) AS valid_samples,
ROUND(VAR_SAMP(current), 3) AS current_var_samp
FROM filtered_data
GROUP BY tbname;
7.3 选择合适的方差类型
| 场景 | 推荐函数 | 原因 |
|---|---|---|
| 抽样调查 | VAR_SAMP | 无偏估计,推断总体 |
| 完整数据 | VARIANCE | 描述实际数据 |
| 质量控制 | VAR_SAMP | 样本检测推断总体 |
| 实时监控 | VARIANCE | 描述当前状态 |
8. 常见问题
Q1: VAR_SAMP 为什么除以 n-1 而不是 n?
A: 这是贝塞尔校正(Bessel's Correction)。当使用样本均值估计总体均值时,样本方差会低估总体方差。除以 n-1 而不是 n 可以得到总体方差的无偏估计。这在统计推断中非常重要。
Q2: 何时 VAR_SAMP 返回 0?
A: 当样本数量为 1 时,VAR_SAMP 返回 0.0,因为:
- 公式中除数为 n-1 = 0
- 单个数据点没有波动
- 无法估计总体方差
Q3: VAR_SAMP 和 VARIANCE 结果差异有多大?
A: 差异取决于样本量 n:
- 样本量越小,差异越大:n=5 时差异 25%
- 样本量越大,差异越小:n=100 时差异约 1%
- 公式:VAR_SAMP = VARIANCE × n/(n-1)
Q4: 如何选择 VAR_SAMP 还是 VARIANCE?
A: 判断标准:
- ✅ 使用 VAR_SAMP:数据是从更大总体中抽取的样本
- ✅ 使用 VARIANCE:数据就是完整的总体
- ✅ 不确定时:使用 VAR_SAMP 更保守安全
Q5: VAR_SAMP 对性能有影响吗?
A: VAR_SAMP 和 VARIANCE 的计算复杂度相同,性能几乎无差异,仅在最终除法时使用不同的除数。
Q6: 样本方差可以为负数吗?
A: 不可以。样本方差永远是非负数:
- 最小值为 0(所有数据相同)
- 数据越分散,方差越大
- 返回 NULL 时表示计算错误或样本不足
9. 相关函数
| 函数 | 说明 | 关系 |
|---|---|---|
| VARIANCE | 总体方差 | VAR_SAMP = VARIANCE × n/(n-1) |
| STDDEV_SAMP | 样本标准差 | STDDEV_SAMP = √VAR_SAMP |
| STDDEV | 总体标准差 | STDDEV = √VARIANCE |
| AVG | 平均值 | 方差计算的中心点 |
| VAR_POP | 总体方差 | 等同于 VARIANCE |
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。