TDengine 数学函数 FLOOR 用户手册

FLOOR

sql 复制代码
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) = 3CEIL(3.7) = 4
  • FLOOR(-3.7) = -4CEIL(-3.7) = -3

错误处理

  • 参数个数错误、类型错误、无效表名等会报错。
  • 对不支持的数据类型(如 timestamp、bool、binary、nchar)会报错。

使用示例

假设有以下智能电表表结构:

sql 复制代码
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: 常量计算

sql 复制代码
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: 不同数值类型

sql 复制代码
-- 整数类型  
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: 电流值整数化

sql 复制代码
-- 插入测试数据  
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: 功率计算整数化

sql 复制代码
-- 计算功率并向下取整  
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: 温度分段统计

sql 复制代码
-- 按温度向下取整分段统计设备数量  
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: 电压波动范围分析

sql 复制代码
-- 分析电压向下取整后的分布  
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: 与其他数学函数组合

sql 复制代码
-- 结合 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: 嵌套使用

sql 复制代码
-- 多次向下取整(实际上一次就够了)  
taos> SELECT FLOOR(FLOOR(FLOOR(current))) AS nested_floor  
      FROM d1001;
  nested_floor  |
==================
     10.000000  |
     12.000000  |
      8.000000  |

示例 9: 在 WHERE 子句中使用

sql 复制代码
-- 查询电流向下取整后等于 10 的记录  
taos> SELECT ts, current  
      FROM d1001  
      WHERE FLOOR(current) = 10;
         ts          |  current  |
====================================
 2018-10-03 14:38:05 | 10.300000 |

示例 10: 费率计算(按整数千瓦时计费)

sql 复制代码
-- 计算用电量并向下取整(只计费完整千瓦时)  
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: 设备容量规划 - 最大负载整数化

sql 复制代码
-- 计算各地区需要的整数容量(向下取整确保保守估计)  
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: 数据质量检查 - 检测异常小数值

sql 复制代码
-- 检测电压值中存在异常小数的记录(理论上应该是整数)  
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: 能效等级划分

sql 复制代码
-- 根据能效比向下取整划分设备等级  
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 的整数值。

实际应用价值
  1. 数据标准化与分箱

    在时序数据分析中,FLOOR 可将连续型数据离散化为整数区间,便于分组统计和趋势分析。例如,将温度、电流等连续变量按整数分箱。

  2. 计费与账单场景

    在能源计费、流量计费等场景中,常使用 FLOOR 向下取整确保只对完整的计费单位收费,避免四舍五入导致的计费争议。

  3. 容量规划与资源分配

    在资源规划时,使用 FLOOR 向下取整可获得保守估计值,避免资源不足。例如,计算最大负载时向下取整确保系统稳定性。

  4. 数据质量检查

    通过对比原值与 FLOOR 后的值,可检测数据中的异常小数部分,用于数据质量监控和异常检测。

  5. 时间序列对齐

    在时间序列数据处理中,FLOOR 可用于将时间戳对齐到整数秒、分钟等边界,便于数据聚合和同步。

  6. 等级划分与分类

    根据数值向下取整结果进行等级划分,如能效等级、负载等级等,便于分类管理和决策支持。

注意事项

  • 负数处理FLOOR(-3.7) = -4,向下取整对负数会取更小的值(更负)。
  • 整数输入:对整数类型输入,FLOOR 返回原值。
  • NULL 处理:输入为 NULL 时返回 NULL。
  • 数据类型:不支持字符串、布尔、时间戳等非数值类型。
  • 精度问题:浮点数计算可能存在精度误差,建议关键场景下使用 DECIMAL 类型。
  • 性能优化:FLOOR 是标量函数,在 WHERE 子句中使用时无法利用索引,建议先过滤数据再计算。

相关函数

  • CEIL:向上取整,返回不小于给定值的最小整数
  • ROUND:四舍五入到最近的整数或指定小数位
  • ABS:绝对值函数
  • TRUNCATE:截断到指定小数位(不进行四舍五入)

这份用户手册详细介绍了 FLOOR 函数的数学意义、实际应用价值、返回值计算过程,以及在智能电表等物联网场景中的丰富应用示例。

关于 TDengine

TDengine 是一款专为物联网、工业互联网等场景设计并优化的大数据平台,其核心模块是高性能、集群开源、云原生、极简的时序数据库。

它能安全高效地将大量设备每天产生的高达 TB 甚至 PB 级的数据进行汇聚、存储、分析和分发,并提供 AI 智能体对数据进行预测与异常检测,提供实时的商业洞察。

相关推荐
大气层煮月亮3 小时前
Oracle EBS ERP开发——报表生成Excel标准模板设计
数据库·oracle·excel
云和数据.ChenGuang4 小时前
达梦数据库的命名空间
数据库·oracle
三三木木七4 小时前
mysql拒绝连接
数据库·mysql
蹦跶的小羊羔4 小时前
sql数据库语法
数据库·sql
唐古乌梁海4 小时前
【mysql】InnoDB的聚簇索引和非聚簇索引工作原理
数据库·mysql
我变秃了也没变强4 小时前
pgsql配置密码复杂度策略
数据库·postgresql
PawSQL4 小时前
企业级SQL审核工具PawSQL介绍(1) - 六大核心能力
数据库·sql·oracle
幼稚园的山代王4 小时前
NoSQL介绍
数据库·nosql
猫林老师5 小时前
HarmonyOS线程模型与性能优化实战
数据库·分布式·harmonyos