TDengine 聚合函数 COUNT 用户手册
COUNT 函数用户手册
函数概述
COUNT
函数是 TDengine 中最基础和最重要的聚合函数之一,用于统计指定字段的记录行数。该函数可以接受星号(*)或具体的列名作为参数,是进行数据计数统计的首选函数。
语法
COUNT({* | expr})
参数说明
*
:统计所有记录数量,包括 NULL 值expr
:指定的列名或表达式,统计该列中非 NULL 值的记录数量
返回值
- 数据类型:BIGINT
- 返回内容:符合条件的记录数量
适用范围
- 数据类型:全部类型字段
- 表类型:普通表和超级表
- 子查询:支持嵌套子查询,适用于内层查询和外层查询
- 分组查询:支持与 GROUP BY 子句配合使用
- 窗口查询:支持 INTERVAL 时间窗口聚合
重要限制
TDengine 有以下语法限制:
❌ 不支持的语法:
COUNT(DISTINCT column)
COUNT(DISTINCT CASE WHEN condition THEN column END)
COUNT(UNIQUE(column))
- 不支持函数嵌套COUNT(CASE WHEN function() THEN 1 END)
- CASE WHEN 中不支持函数调用
✅ 支持的语法:
COUNT(column)
COUNT(*)
COUNT(CASE WHEN column > value THEN 1 END)
- 简单条件判断
智能电表场景应用示例
基于智能电表数据库结构:
-- 数据库和表结构
USE test;
-- meters 超级表包含 ts, current, voltage, phase 字段和 location, groupid 标签
基础统计功能
总记录数统计
-- 统计所有电表的总记录数
SELECT COUNT(*) FROM meters;-- 统计电流数据的有效记录数(非空值)
SELECT COUNT(current) FROM meters;-- 统计电压数据的有效记录数
SELECT COUNT(voltage) FROM meters;-- 统计相位数据的有效记录数
SELECT COUNT(phase) FROM meters;
多字段统计
-- 同时统计多个字段的非空值数量
SELECT COUNT(current) as current_count,COUNT(voltage) as voltage_count,COUNT(phase) as phase_count,COUNT(*) as total_count
FROM meters;
条件统计分析
按数值范围统计
-- 统计电流大于 20A 的记录数
SELECT COUNT(*) FROM meters WHERE current > 20;-- 统计电压在正常范围内的记录数
SELECT COUNT(*) FROM meters WHERE voltage BETWEEN 200 AND 240;-- 统计相位值异常的记录数
SELECT COUNT(*) FROM meters WHERE phase < 0.85 OR phase > 1.0;
按时间范围统计
-- 统计最近一小时的数据记录数
SELECT COUNT(*) FROM meters
WHERE ts >= NOW() - 1h;-- 统计今日的数据记录数
SELECT COUNT(*) FROM meters
WHERE ts >= TODAY();-- 统计本周的数据记录数
SELECT COUNT(*) FROM meters
WHERE ts >= NOW() - 7d;
分组统计分析
按区域分组统计
-- 按地理位置统计各区域的记录数
SELECT location,COUNT(*) as total_records,COUNT(current) as current_records,COUNT(voltage) as voltage_records
FROM meters
GROUP BY location;
按设备组分组统计
-- 按设备组统计记录数
SELECT groupid,location,COUNT(*) as group_records,COUNT(current) as valid_current_data
FROM meters
GROUP BY groupid, location;
按电表分组统计
-- 统计每个电表的记录数
SELECT tbname,location,COUNT(*) as device_records,COUNT(current) as current_data_count
FROM meters
GROUP BY tbname, location
ORDER BY device_records DESC;
时间窗口统计
按小时统计
-- 每小时数据记录数统计
SELECT COUNT(*) as hourly_count
FROM meters
INTERVAL(1h);-- 按区域每小时统计
SELECT location,COUNT(*) as hourly_records
FROM meters
INTERVAL(1h) GROUP BY location;
按天统计
-- 每日数据记录数统计
SELECT COUNT(*) as daily_count
FROM meters
INTERVAL(1d);-- 按电表每日统计
SELECT tbname,COUNT(*) as daily_device_count
FROM meters
INTERVAL(1d) GROUP BY tbname;
滑动窗口统计
-- 滑动窗口统计(每小时窗口,30分钟滑动)
SELECT COUNT(*) as sliding_count
FROM meters
INTERVAL(1h) SLIDING(30m);
数据质量分析
数据完整性检查
-- 检查各字段的数据完整性
SELECT location,COUNT(*) as total_count,COUNT(current) as current_count,COUNT(voltage) as voltage_count,COUNT(phase) as phase_count,(COUNT(*) - COUNT(current)) as current_missing,(COUNT(*) - COUNT(voltage)) as voltage_missing,(COUNT(*) - COUNT(phase)) as phase_missing
FROM meters
GROUP BY location;
设备数据上报率统计
-- 统计各设备的数据上报频率
SELECT tbname,location,COUNT(*) as report_count,CASE WHEN COUNT(*) >= 1440 THEN '正常上报' -- 假设每分钟一条记录WHEN COUNT(*) >= 720 THEN '上报偏少'ELSE '上报异常'END as report_status
FROM meters
WHERE ts >= NOW() - 1d
GROUP BY tbname, location;
使用 UNION ALL 合并统计
-- 合并在线设备和总设备统计
SELECT location,stat_type,device_count
FROM (SELECT location,'online' as stat_type,COUNT(*) as device_countFROM (SELECT DISTINCT location, tbname FROM meters WHERE ts >= NOW() - 10m) GROUP BY locationUNION ALLSELECT location,'total' as stat_type,COUNT(*) as device_countFROM (SELECT DISTINCT location, tbname FROM meters) GROUP BY location
)
ORDER BY location, stat_type;
实际应用价值
负载预测
-- 为负载预测提供基准数据
SELECT location,COUNT(*) as data_points
FROM meters
WHERE ts >= NOW() - 30d
GROUP BY location;
设备配置优化
-- 为设备配置提供参考
SELECT groupid,COUNT(*) as measurement_points
FROM meters
GROUP BY groupid;
性能优化建议
时间范围优化
-- 推荐:指定时间范围
SELECT COUNT(*) FROM meters
WHERE ts >= NOW() - 1d;-- 不推荐:无条件全表统计(数据量很大时)
SELECT COUNT(*) FROM meters;
索引利用
-- 利用标签索引的查询
SELECT COUNT(*) FROM meters
WHERE location = 'Beijing';-- 利用时间索引的查询
SELECT COUNT(*) FROM meters
WHERE ts BETWEEN '2024-01-01 00:00:00' AND '2024-01-01 23:59:59';
注意事项
-
NULL 值处理:
COUNT(*)
计算所有行,包括 NULL 值COUNT(column)
只计算非 NULL 值
-
语法限制:
- 不支持
COUNT(DISTINCT column)
语法 - 不支持函数嵌套,如
COUNT(UNIQUE(column))
- CASE WHEN 中不能使用函数调用
- 不支持
-
性能考虑:
- 大表上的无条件 COUNT 操作可能较慢
- 建议结合时间范围或其他过滤条件使用
-
数据类型:
- 返回值始终为 BIGINT 类型
- 可以处理任何数据类型的输入列
-
聚合规则:
- 在 GROUP BY 查询中,COUNT 为每个分组返回一个结果
- 在窗口查询中,COUNT 为每个时间窗口返回一个结果
-
时间间隔语法:
- 使用
NOW() - 1h
而不是NOW() - INTERVAL 1 HOUR
- 使用
NOW() - 1d
而不是NOW() - INTERVAL 1 DAY
- 支持的时间单位:
s
(秒)、m
(分钟)、h
(小时)、d
(天)
- 使用
-
tsCountAlwaysReturnValue 参数:
- 当启用此参数时,即使没有数据也返回 0
- 默认情况下,无数据时返回空结果
相关函数
- SUM(): 计算总和
- AVG(): 计算平均值
- MAX(): 返回最大值
- MIN(): 返回最小值
- FIRST(): 返回最先的值
- LAST(): 返回最后的值
- UNIQUE(): 返回去重后的值(不能嵌套使用)
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。