TDengine 统计函数 VAR_SAMP 用户手册

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 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
IT机器猫41 分钟前
ES基础一
大数据·elasticsearch·搜索引擎
卿雪42 分钟前
MySQL【数据库的三大范式】:1NF 原子、2NF 完全依赖、3NF 不可传递
数据库·mysql
u***324343 分钟前
redis连接服务
数据库·redis·bootstrap
wuletaotao1 小时前
Windows 下 Redis 使用完整教程
数据库·windows·redis
RestCloud1 小时前
神州通用数据库的 ETL 集成方案:兼容性与性能实战
数据库·数据仓库·etl·数据处理·数据集成·数据传输·神州通用
搂着猫睡的小鱼鱼1 小时前
noon商品详情获取及调用指南
数据库
黄焖鸡能干四碗1 小时前
制造企业工业大数据平台建设方案
大数据·数据库·安全·制造
s***46981 小时前
SQL 中UPDATE 和 DELETE 语句的深入理解与应用
数据库·sql
Elastic 中国社区官方博客1 小时前
EDB EPAS 通过 PostgreSQL 连接器同步数据到 Elasticsearch
大数据·数据库·人工智能·elasticsearch·搜索引擎·postgresql·全文检索