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 智能体对数据进行预测与异常检测,提供实时的商业洞察。

相关推荐
门思科技几秒前
LoRa 与 LoRaWAN 技术解析:物理层原理、网络架构与典型物联网应用场景
网络·物联网·架构
数据最前线7 分钟前
数据管理技术发展的3个阶段
数据库·考研·数据库系统概论
api_1800790546028 分钟前
【技术教程】Python/Node.js 调用拼多多商品详情 API 示例详解
大数据·开发语言·python·数据挖掘·node.js
SelectDB29 分钟前
冷查第一,再登榜首!Apache Doris 3.1 全面刷新 JSONBench 性能纪录
数据库·apache
wei_shuo35 分钟前
智能运维×低资源占用:金仓数据库助力能源企业降本增效与国产化替换实践
运维·数据库·king base
nvd1143 分钟前
GKE连接私有Cloud SQL疑难问题排查实录
数据库·sql
Dev7z1 小时前
MySQL 错误 1046 (3D000) 是因为在执行 SQL 语句时 没有选择当前数据库
数据库·sql·mysql
wangchen_01 小时前
MySQL表的查询
数据库·mysql
hzbigdog2 小时前
php的CSV大数据导入导出的通用处理类
大数据·后端·php
倔强的石头_2 小时前
金仓KES:玩转“五位一体”融合架构,轻松驾驭数字时代
数据库