☰
SonnetDB 基础聚合函数:count/sum/min/max/avg/first/last
2026/10/12 3:59:39 网站建设 项目流程

SonnetDB 基础聚合函数:count/sum/min/max/avg/first/last

SonnetDB 的基础聚合把时序采样转换为计数、总和、极值、平均值和首末状态。本文围绕 measurement 查询说明七种函数,并区分字段缺失、输入类型和多序列边界。内容按 2026-10-11 当前工作树文档与实现审阅;SQL 是使用示例,本轮没有执行 SQL 或测量性能,也不据此认定所有已发行客户端具备相同能力。

从一个已声明的 measurement 开始

下面的示例要求已连接可写的测试数据库,并具备建表、写入和读取权限;measurement 名称不能与已有对象冲突。时间戳使用 Unix 毫秒。

CREATEMEASUREMENT cpu(host TAG,usageFIELDFLOAT,statusFIELD STRING);INSERTINTOcpu(time,host,usage,status)VALUES(1700000000000,'server-01',20,'idle'),(1700000001000,'server-01',40,'busy');SELECTcount(*),count(usage),sum(usage),avg(usage),min(usage),max(usage),first(status),last(status)FROMcpuWHEREhost='server-01'ANDtime>=1700000000000ANDtime<1700000060000;

count:行数与字段采样数

count(*)统计行。同一 series 的多个 FIELD 在同一时间戳写入,计为一行;字段稀疏时,行存在性由各 FIELD 时间戳的并集确定。不同 series 在同一时刻仍属于不同的行。

count(usage)只统计 usage 有值的时刻。因此“该时刻存在某个字段”和“usage 在该时刻有值”是两种条件,两种计数可能不同。缺少字段时,查询列可以返回 NULL;这不等于写入了一个可参与所有数学聚合的数值。

sum、avg、min、max:先核输入类型

sum/avg用于数值 FIELD。不要对状态字符串求和或求平均;实现会拒绝这类输入。Boolean 沿用 false=0、true=1 的数值转换,但使用时仍需核对具体函数和执行路径。

min/max除数值外也接受字符串,字符串按 Ordinal 比较,不按中文拼音排序。聚合结果的整数精度、NULL 和空输入行为不能从某一模型直接推广到所有模型;本例使用 FLOAT,未展示空输入结果,也不承诺所有空聚合统一返回 NULL。

first、last:按时间选择并保留类型

first/last按时间戳选择首末值,并保留原字段类型,可用于字符串状态、向量和地理点。它们与按数值大小取极值的min/max含义不同。

当前 measurement 执行路径对多 series 的 FIRST/LAST 仍有拒绝边界。示例只有 host 一个 TAG,并通过等值条件限定一个序列。实际 schema 有多个 TAG 时,应同时限定它们;不能把跨设备查询的首末状态解释成每台设备的结果。相同时间戳下的并列值也不要凭本例推定额外的稳定排序合同。

时间桶与单字段 DISTINCT

SELECTtime,count(usage),avg(usage),max(usage)FROMcpuWHEREhost='server-01'ANDtime>=1700000000000ANDtime<1700000060000GROUPBYtime(1m);

显式投影time才返回桶起始时间。GROUP BY time(1m)按一分钟的桶计算指标;它不等于按任意 TAG 列分组,也不说明查询具有生产性能保证。

标准聚合支持单字段 DISTINCT,例如count(DISTINCT status),在结果或时间桶内按 SQL 值相等规则去重,再忽略 NULL 求值。count(DISTINCT *)明确不受支持;多表达式 DISTINCT、排序集合聚合和窗口 DISTINCT 不由这个例子涵盖。

基础聚合适合表达报表问题,使用前仍要核对字段类型、稀疏采样和序列范围。本文依据当前docs/sql-reference.md、SelectExecutor.cs和字段选择器实现审阅,未执行示例、创建数据库或验收模型质量与生产性能。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询