TDengine 数学函数 FLOOR 用户手册
FLOOR
FLOOR(expr)
功能说明
返回指定字段的向下取整(不大于该值的最大整数)。
版本
v3.0.0.0
返回结果类型
与输入字段的原始数据类型一致(整数类型返回整数,浮点类型返回浮点)。
适用数据类型
数值类型(TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE 及其无符号类型)。
嵌套子查询支持
适用于内层查询和外层查询。
适用于
表和超级表。
使用说明
- 若
expr
为 NULL,返回 NULL。 - 只能与普通列、选择(Selection)、投影(Projection)函数一起使用,不能与聚合(Aggregation)函数一起使用。
- 不支持字符串、布尔、时间戳等非数值类型。
- 支持嵌套使用,如
FLOOR(FLOOR(c1))
。 - 不支持与聚合函数(如 COUNT、AVG)混用。
- 对于整数类型,结果等于原值;对于浮点类型,结果为向下取整后的浮点数。
返回值计算过程
FLOOR 函数的计算遵循数学定义:
- 正数:
FLOOR(3.7) = 3
,返回不大于 3.7 的最大整数 - 负数:
FLOOR(-3.7) = -4
,返回不大于 -3.7 的最大整数(注意:-4 < -3.7 < -3) - 整数:
FLOOR(5) = 5
,整数的向下取整等于自身 - 零:
FLOOR(0) = 0
与 CEIL 的区别:
FLOOR(3.7) = 3
,CEIL(3.7) = 4
FLOOR(-3.7) = -4
,CEIL(-3.7) = -3
错误处理
- 参数个数错误、类型错误、无效表名等会报错。
- 对不支持的数据类型(如 timestamp、bool、binary、nchar)会报错。
使用示例
假设有以下智能电表表结构:
CREATE DATABASE power;
USE power; CREATE STABLE meters ( ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT, temperature FLOAT
) TAGS ( location VARCHAR(64), groupId INT
); CREATE TABLE d1001 USING meters TAGS ('California.SanFrancisco', 1);
CREATE TABLE d1002 USING meters TAGS ('California.LosAngeles', 2);
基础示例
示例 1: 常量计算
taos> SELECT FLOOR(1.1); floor(1.1) |
==========================1 |taos> SELECT FLOOR(-1.1); floor(-1.1) |
==========================-2 |taos> SELECT FLOOR(5); floor(5) |
==========================5 |taos> SELECT FLOOR(NULL); floor(null) |
==========================NULL |
示例 2: 不同数值类型
-- 整数类型
taos> SELECT FLOOR(100); floor(100) |
==========================100 |-- 浮点类型
taos> SELECT FLOOR(3.14159); floor(3.14159) |
==========================3 |-- 负数
taos> SELECT FLOOR(-9.99); floor(-9.99) |
==========================-10 |
智能电表场景示例
示例 3: 电流值整数化
-- 插入测试数据
INSERT INTO d1001 VALUES ('2018-10-03 14:38:05.000', 10.3, 220, 0.31, 25.5), ('2018-10-03 14:38:15.000', 12.6, 220, 0.33, 28.2), ('2018-10-03 14:38:16.800', 8.5, 221, 0.32, 22.8); -- 将电流值向下取整为整数安培
taos> SELECT ts, current, FLOOR(current) AS current_floor FROM d1001; ts | current | current_floor |
======================================================2018-10-03 14:38:05 | 10.300000 | 10.000000 |2018-10-03 14:38:15 | 12.600000 | 12.000000 |2018-10-03 14:38:16 | 8.500000 | 8.000000 |
示例 4: 功率计算整数化
-- 计算功率并向下取整
taos> SELECT ts, current * voltage AS power_real, FLOOR(current * voltage) AS power_floor FROM d1001;ts | power_real | power_floor |
==================================================2018-10-03 14:38:05 | 2266.000000 | 2266.000000 |2018-10-03 14:38:15 | 2772.000000 | 2772.000000 |2018-10-03 14:38:16 | 1878.500000 | 1878.000000 |
示例 5: 温度分段统计
-- 按温度向下取整分段统计设备数量
taos> SELECT FLOOR(temperature) AS temp_floor, COUNT(*) AS device_count FROM meters WHERE ts >= NOW - 1d GROUP BY FLOOR(temperature) ORDER BY temp_floor;temp_floor | device_count |
================================22 | 150 |23 | 280 |24 | 320 |25 | 410 |
示例 6: 电压波动范围分析
-- 分析电压向下取整后的分布
taos> SELECT FLOOR(voltage) AS voltage_floor, MIN(voltage) AS min_voltage, MAX(voltage) AS max_voltage, COUNT(*) AS count FROM meters WHERE ts >= NOW - 7d GROUP BY FLOOR(voltage);voltage_floor | min_voltage | max_voltage | count |
=======================================================218 | 218.2 | 218.9 | 123 |219 | 219.1 | 219.8 | 456 |220 | 220.0 | 220.9 | 789 |221 | 221.0 | 221.7 | 234 |
示例 7: 与其他数学函数组合
-- 结合 ABS 和 FLOOR
taos> SELECT ts, phase, FLOOR(ABS(phase * 100)) AS phase_floor_abs FROM d1001;-- 计算电流差值并向下取整
taos> SELECT ts, current, FLOOR(current - LAG(current, 1) OVER (ORDER BY ts)) AS current_diff_floor FROM d1001;
示例 8: 嵌套使用
-- 多次向下取整(实际上一次就够了)
taos> SELECT FLOOR(FLOOR(FLOOR(current))) AS nested_floor FROM d1001;nested_floor |
==================10.000000 |12.000000 |8.000000 |
示例 9: 在 WHERE 子句中使用
-- 查询电流向下取整后等于 10 的记录
taos> SELECT ts, current FROM d1001 WHERE FLOOR(current) = 10;ts | current |
====================================2018-10-03 14:38:05 | 10.300000 |
示例 10: 费率计算(按整数千瓦时计费)
-- 计算用电量并向下取整(只计费完整千瓦时)
taos> SELECT location, SUM(current * voltage / 1000 * 0.001) AS kwh_total, FLOOR(SUM(current * voltage / 1000 * 0.001)) AS kwh_billable FROM meters WHERE ts >= NOW - 1d PARTITION BY location INTERVAL(1d);
实际生产场景应用
场景 1: 设备容量规划 - 最大负载整数化
-- 计算各地区需要的整数容量(向下取整确保保守估计)
SELECT location, MAX(current * voltage / 1000) AS peak_kw_actual, FLOOR(MAX(current * voltage / 1000)) AS peak_kw_planning
FROM meters
WHERE ts >= NOW - 30d
GROUP BY location;
场景 2: 数据质量检查 - 检测异常小数值
-- 检测电压值中存在异常小数的记录(理论上应该是整数)
SELECT ts, tbname, voltage, voltage - FLOOR(voltage) AS decimal_part
FROM meters
WHERE voltage - FLOOR(voltage) > 0.1 AND ts >= NOW - 1d
ORDER BY decimal_part DESC;
场景 3: 能效等级划分
-- 根据能效比向下取整划分设备等级
SELECT tbname, AVG(current * voltage / temperature) AS efficiency_ratio, FLOOR(AVG(current * voltage / temperature)) AS efficiency_level, CASE WHEN FLOOR(AVG(current * voltage / temperature)) >= 90 THEN '一级能效' WHEN FLOOR(AVG(current * voltage / temperature)) >= 80 THEN '二级能效' WHEN FLOOR(AVG(current * voltage / temperature)) >= 70 THEN '三级能效' ELSE '低效设备' END AS efficiency_grade
FROM meters
WHERE ts >= NOW - 30d
GROUP BY tbname;
函数意义与实际应用价值
数学意义
FLOOR 函数在数学上表示向下取整,即取不大于给定数值的最大整数。对于任意实数 x,FLOOR(x) 返回满足 FLOOR(x) ≤ x < FLOOR(x) + 1 的整数值。
实际应用价值
-
数据标准化与分箱
在时序数据分析中,FLOOR 可将连续型数据离散化为整数区间,便于分组统计和趋势分析。例如,将温度、电流等连续变量按整数分箱。 -
计费与账单场景
在能源计费、流量计费等场景中,常使用 FLOOR 向下取整确保只对完整的计费单位收费,避免四舍五入导致的计费争议。 -
容量规划与资源分配
在资源规划时,使用 FLOOR 向下取整可获得保守估计值,避免资源不足。例如,计算最大负载时向下取整确保系统稳定性。 -
数据质量检查
通过对比原值与 FLOOR 后的值,可检测数据中的异常小数部分,用于数据质量监控和异常检测。 -
时间序列对齐
在时间序列数据处理中,FLOOR 可用于将时间戳对齐到整数秒、分钟等边界,便于数据聚合和同步。 -
等级划分与分类
根据数值向下取整结果进行等级划分,如能效等级、负载等级等,便于分类管理和决策支持。
注意事项
- 负数处理:
FLOOR(-3.7) = -4
,向下取整对负数会取更小的值(更负)。 - 整数输入:对整数类型输入,FLOOR 返回原值。
- NULL 处理:输入为 NULL 时返回 NULL。
- 数据类型:不支持字符串、布尔、时间戳等非数值类型。
- 精度问题:浮点数计算可能存在精度误差,建议关键场景下使用 DECIMAL 类型。
- 性能优化:FLOOR 是标量函数,在 WHERE 子句中使用时无法利用索引,建议先过滤数据再计算。
相关函数
- CEIL:向上取整,返回不小于给定值的最小整数
- ROUND:四舍五入到最近的整数或指定小数位
- ABS:绝对值函数
- TRUNCATE:截断到指定小数位(不进行四舍五入)
这份用户手册详细介绍了 FLOOR 函数的数学意义、实际应用价值、返回值计算过程,以及在智能电表等物联网场景中的丰富应用示例。
关于 TDengine
TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。
它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。