使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(10)

简介: 物联网提供限制/限制条款和偏移/偏移子句,以使用户对查询结果有更多的控制权。使用 LIMIT 和 SLIMIT 子句允许用户控制查询结果的行数和列数,使用 OFFSET 和 SOFSET 子句允许用户设置结果的起始位置进行显示。

所有参数的详细说明见表3-5。

表 3-5 线性填充参数列表

参数名称(不区分大小写) 解释
路径,前缀路径 查询路径;必填项
T 查询时间戳(只能指定一个);必填项
data_type 填充方法使用的数据类型。可选值为 int32、int64、浮点型、双精度型、布尔值、文本;可选字段
before_range, after_range 表示线性方法的有效时间范围。当存在 [T-before_range, T+after_range] 范围内的值时,前一种方法有效。如果未显式指定before_range和after_range,则使用 default_fill_interval。-1 表示无穷大;可选字段

请注意,如果时间序列在查询时间戳 T 处具有有效值,则此值将用作线性填充值。否则,如果在 [T-before_range,T] 或 [T, T + after_range] 范围内没有有效的填充值,则线性填充方法将返回 null。

在这里,我们给出了使用线性方法填充空值的示例。SQL 语句如下:

  1. select temperature from root.sgcc.wf03.wt01 wheretime= 2017-11-01T16:37:50.000 fill(float [linear, 1m, 1m])

这意味着:

因为时间序列根.sgcc.wf03.wt01.temperature在2017-11-01T16:37:50.000为空,系统使用之前的时间戳2017-11-01T16:37:00.000(时间戳在[2017-11-01T16:36:50.000,2017-11-01T16:37:50.000]时间范围内)及其值21.927326,下一个时间戳2017-11-01T16:38:00.000(时间戳在[2017-11-01T16:37:50.000,2017-11-01T16:38:50.000]时间范围内)及其值25.311783进行线性拟合计算: 21.927326 + (25.311783-21.927326)/60s * 50s = 24.747707

此语句的执行结果如下所示:

数据类型和填充方法之间的对应关系

数据类型和支持的填充方法如表 3-6 所示。

表 3-6 数据类型和支持的填充方法**

数据类型 支持的填充方法
布尔 以前
国际特32 上一篇, 线性
国际特64 上一篇, 线性
浮 上一篇, 线性
双 上一篇, 线性
发短信 以前

值得注意的是,对于数据类型不支持的填充方法,IoTDB 会给出错误提示,如下所示:

如果未指定 fill 方法,则每种数据类型都有自己的默认填充方法和参数。相应的关系如表3-7所示。

表 3-7 各种数据类型的默认填充方法和参数**

数据类型 默认填充方法和参数
布尔 前一页, 600000
国际特32 前一页, 600000
国际特64 前一页, 600000
浮 前一页, 600000
双 前一页, 600000
发短信 前一页, 600000

注意:在 0.7.0 版中,至少应在 Fill 语句中指定一个填充方法。

对查询结果的行和列控制

物联网提供限制/限制条款和偏移/偏移子句,以使用户对查询结果有更多的控制权。使用 LIMIT 和 SLIMIT 子句允许用户控制查询结果的行数和列数,使用 OFFSET 和 SOFSET 子句允许用户设置结果的起始位置进行显示。

请注意,分组依据查询不支持 LIMIT 和 OFFSET。

本章主要介绍查询结果行列控制的相关示例。您还可以使用Java JDBC用于执行查询的标准接口。

对查询结果的行控制

通过使用 LIMIT 和 OFFSET 子句,用户可以以与行相关的方式控制查询结果。我们将通过以下示例演示如何使用 LIMIT 和 OFFSET 子句。

  • 示例 1:基本限制子句

SQL 语句为:

  1. selectstatus, temperature from root.ln.wf01.wt01 limit10

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列为“状态”和“温度”。SQL 语句要求返回查询结果的前 10 行。

结果如下所示:

  • 示例 2:带偏移的 LIMIT 子句

SQL 语句为:

  1. selectstatus, temperature from root.ln.wf01.wt01 limit5offset3

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列为“状态”和“温度”。SQL 语句要求返回查询结果的第 3 行到第 7 行(第一行编号为第 0 行)。

结果如下所示:

  • 示例 3:限制子句与 WHERE 子句的组合

SQL 语句为:

  1. selectstatus,temperature from root.ln.wf01.wt01 wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000limit2offset3

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列为“状态”和“温度”。SQL 语句要求返回“3-4-2017T11:01:00.05”和“00-000-2017T11:01:00.12”之间的状态和温度传感器值的第 00 行到第 000 行(第一行编号为第 0 行)。

结果如下所示:

  • 示例 4:LIMIT 子句与 GROUP BY 子句的组合

SQL 语句为:

  1. selectcount(status), max_value(temperature) from root.ln.wf01.wt01 group by ([2017-11-01T00:00:00, 2017-11-07T23:00:00),1d)limit5offset3

这意味着:

SQL 语句子句要求返回查询结果的第 3 行到第 7 行(第一行编号为第 0 行)。

结果如下所示:

值得注意的是,由于目前的 FILL 子句只能填充某个时间点的时间序列缺失值,也就是说 FILL 子句的执行结果正好是一行,所以 LIMIT 和 OFFSET 预计不会与 FILL 子句结合使用,否则会提示错误。例如,执行以下 SQL 语句:

  1. select temperature from root.sgcc.wf03.wt01 wheretime= 2017-11-01T16:37:50.000 fill(float[previous, 1m])limit10

SQL 语句将不会执行,相应的错误提示如下:

对查询结果的列控制

通过使用 SLIMIT 和 SOFFSET 子句,用户可以以与列相关的方式控制查询结果。我们将通过以下示例演示如何使用 SLIMIT 和 SOFFSET 子句。

  • 示例 1:基本 SLIMIT 子句

SQL 语句为:

  1. select * fromroot.ln.wf01.wt01wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000slimit1

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列是此设备下的第一列,即电源状态。SQL 语句要求选择时间点“2017-11-01T00:05:00.000”和“2017-11-01T00:12:00.000”之间的状态传感器值。

结果如下所示:

  • 示例 2:带有偏移量的 SLIMIT 子句

SQL 语句为:

  1. select * fromroot.ln.wf01.wt01wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000slimit1soffset1

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列是该设备下的第二列,即温度。SQL 语句要求选择时间点“2017-11-01T00:05:00.000”和“2017-11-01T00:12:00.000”之间的温度传感器值。

结果如下所示:

  • 示例 3:SLIMIT 子句与 GROUP BY 子句的组合

SQL 语句为:

  1. select max_value(*) from root.ln.wf01.wt01 group by ([2017-11-01T00:00:00, 2017-11-07T23:00:00),1d) slimit 1 soffset 1

结果如下所示:

  • 示例 4:SLIMIT 子句与 FILL 子句的组合

SQL 语句为:

  1. select * from root.sgcc.wf03.wt01 wheretime= 2017-11-01T16:37:50.000 fill(float[previous, 1m]) slimit 1 soffset 1

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列是该设备下的第二列,即温度。

结果如下所示:

值得注意的是,SLIMIT 子句预计会与星号路径或前缀路径结合使用,当 SLIMIT 子句与完整路径查询结合使用时,系统会提示错误。例如,执行以下 SQL 语句:

  1. selectstatus,temperaturefromroot.ln.wf01.wt01wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000slimit1

SQL 语句将不会执行,相应的错误提示如下:

对查询结果的行和列控制

除了对查询结果进行行或列控制外,IoTDB 还允许用户控制查询结果的行和列。下面是一个包含 LIMIT 子句和 SLIMIT 子句的完整示例。

SQL 语句为:

  1. select * from root.ln.wf01.wt01 limit10offset100 slimit 2 soffset 0

这意味着:

选择的设备是ln组wf01工厂wt01设备;所选时间序列是此设备下的第 0 到 1 列(第一列编号为 0 列)。SQL 语句子句要求返回查询结果的第 100 到 109 行(第一行编号为第 0 行)。

结果如下所示:

其他结果集格式

此外,IoTDB 还支持另外两种结果集格式:“按设备对齐”和“禁用对齐”。

“按设备对齐”表示将设备 ID 视为一列。因此,数据集中的列完全有限。

SQL 语句为:

  1. select s1,s2 from root.sg1.*GROUPBY DEVICE

有关更多语法说明,请阅读 SQL 参考。

“禁用对齐”表示结果集中每个时间序列有 3 列。有关更多语法说明,请阅读 SQL 参考。

错误处理

当 LIMIT/SLIMIT 的参数 N/SN 超过结果集大小时,IoTDB 将按预期返回所有结果。例如,原始 SQL 语句的查询结果由六行组成,我们通过 LIMIT 子句选择前 100 行:

  1. selectstatus,temperature from root.ln.wf01.wt01 wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000limit100

结果如下所示:

当 LIMIT/SLIMIT 子句的参数 N/SN 超过允许的最大值(N/SN 的类型为 int32)时,系统将提示错误。例如,执行以下 SQL 语句:

  1. selectstatus,temperature from root.ln.wf01.wt01 wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000limit1234567890123456789

SQL 语句将不会执行,相应的错误提示如下:

当 LIMIT/SLIMIT 子句的参数 N/SN 不是正向时,系统将提示错误。例如,执行以下 SQL 语句:

  1. selectstatus,temperaturefromroot.ln.wf01.wt01wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000limit13.1

SQL 语句将不会执行,相应的错误提示如下:

当 LIMIT 子句的参数 OFFSET 超过结果集的大小时,IoTDB 将返回一个空的结果集。例如,执行以下 SQL 语句:

  1. selectstatus,temperature from root.ln.wf01.wt01 wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000limit2offset6

结果如下所示:

当SLIMIT子句的参数SOFFSET不小于可用时间序列的数量时,系统将提示错误。例如,执行以下 SQL 语句:

  1. select * fromroot.ln.wf01.wt01wheretime> 2017-11-01T00:05:00.000 andtime< 2017-11-01T00:12:00.000slimit1soffset2

SQL 语句将不会执行,相应的错误提示如下:

删除

用户可以删除指定时间序列中满足删除条件的数据,方法是使用删除语句.删除数据时,用户可以选择一个或多个时间序列路径、前缀路径或带星号的路径删除特定时间之前的数据(当前版本不支持在封闭时间间隔内删除数据)。

在 JAVA 编程环境中,您可以使用Java JDBC以执行单个或批处理 UPDATE 语句。

删除单个时间序列

以ln集团为例,存在这样的使用场景:

wf02工厂的wt02设备在2017-11-01 16:26:00之前电源状态存在多段错误,无法正确分析数据。错误数据影响了与其他设备的相关性分析。此时,需要删除此时间点之前的数据。此操作的 SQL 语句为

  1. delete from root.ln.wf02.wt02.status wheretime<=2017-11-01T16:26:00;

删除多个时间序列

当02-02-2017 11:01:16之前的ln组wf26工厂wt00设备的电源状态和硬件版本都需要删除时,具有更广泛含义的前缀路径或具有星号的路径可用于删除数据。此操作的 SQL 语句为:

  1. delete from root.ln.wf02.wt02 wheretime<= 2017-11-01T16:26:00;

或

  1. delete from root.ln.wf02.wt02.* wheretime<= 2017-11-01T16:26:00;

需要注意的是,当删除的路径不存在时,IoTDB会给出相应的错误提示,如下所示:

  1. IoTDB> delete fromroot.ln.wf03.wt02.statuswheretime<now()
  2. Msg: TimeSeries does not exist and its data cannot be deleted
相关文章
|
SQL 前端开发 关系型数据库
如何开发一套研发项目管理系统?(附架构图+流程图+代码参考)
研发项目管理系统助力企业实现需求、缺陷与变更的全流程管理,支持看板可视化、数据化决策与成本优化。系统以MVP模式快速上线,核心功能包括需求看板、缺陷闭环、自动日报及关键指标分析,助力中小企业提升交付效率与协作质量。
1037 29
|
NoSQL 数据可视化 安全
如何开发一套车辆管理系统?(附架构图+流程图+代码参考)
本文介绍了如何通过搭建车辆管理系统(VMS)帮助企业摆脱传统管理方式,实现流程化、可视化、合规化和自动化。内容涵盖系统架构、关键功能模块、数据模型、API设计、前后端实现及实施建议,提供可落地的技术方案,助力企业降低隐形成本、提升管理效率与透明度,实现数据驱动决策。
1083 40
|
JSON 文字识别 BI
如何开发车辆管理系统中的加油管理板块(附架构图+流程图+代码参考)
本文针对中小企业在车辆加油管理中常见的单据混乱、油卡管理困难、对账困难等问题,提出了一套完整的系统化解决方案。内容涵盖车辆管理系统(VMS)的核心功能、加油管理模块的设计要点、数据库模型、系统架构、关键业务流程、API设计与实现示例、前端展示参考(React + Antd)、开发技巧与工程化建议等。通过构建加油管理系统,企业可实现燃油费用的透明化、自动化对账、异常检测与数据分析,从而降低运营成本、提升管理效率。适合希望通过技术手段优化车辆管理的企业技术人员与管理者参考。
|
消息中间件 缓存 JavaScript
如何开发ERP(离散制造-MTO)系统中的生产管理板块(附架构图+流程图+代码参考)
本文详解离散制造MTO模式下的ERP生产管理模块,涵盖核心问题、系统架构、关键流程、开发技巧及数据库设计,助力企业打通计划与执行“最后一公里”,提升交付率、降低库存与浪费。
|
前端开发 JavaScript BI
如何开发车辆管理系统中的车务管理板块(附架构图+流程图+代码参考)
本文介绍了中小企业如何通过车务管理模块提升车辆管理效率。许多企业在管理车辆时仍依赖人工流程,导致违章处理延误、年检过期、维修费用虚高等问题频发。将这些流程数字化,可显著降低合规风险、提升维修追溯性、优化调度与资产利用率。文章详细介绍了车务管理模块的功能清单、数据模型、系统架构、API与前端设计、开发技巧与落地建议,以及实现效果与验收标准。同时提供了数据库建表SQL、后端Node.js/TypeScript代码示例与前端React表单设计参考,帮助企业快速搭建并上线系统,实现合规与成本控制的双重优化。
|
数据采集 运维 数据可视化
AR 运维系统与 MES、EMA、IoT 系统的融合架构与实践
AR运维系统融合IoT、EMA、MES数据,构建“感知-分析-决策-执行”闭环。通过AR终端实现设备数据可视化,实时呈现温度、工单等信息,提升运维效率与生产可靠性。(238字)
|
消息中间件 JavaScript 前端开发
如何开发ERP(离散制造-MTO)系统中的技术管理板块(附架构图+流程图+代码参考)
本文详解ERP(离散制造-MTO)系统中的技术管理板块,涵盖产品定义、BOM、工序、工艺文件及变更控制的结构化与系统化管理。内容包括技术管理的核心目标、总体架构、关键组件、业务流程、开发技巧与最佳实践,并提供完整的参考代码,助力企业将技术数据转化为可执行的生产指令,提升制造效率与质量。
|
消息中间件 JavaScript 关系型数据库
如何开发一套ERP(离散制造-MTO)系统(附架构图+流程图+代码参考)
本文介绍了面向离散制造-MTO(按订单生产)模式的ERP系统设计与实现方法。内容涵盖ERP系统定义、总体架构设计、主要功能模块解析、关键业务流程(订单到交付、BOM展开、MRP逻辑、排产等)、开发技巧(DDD、微服务、事件驱动)、参考代码示例、部署上线注意事项及实施效果评估。旨在帮助企业与开发团队构建高效、灵活、可扩展的ERP系统,提升订单交付能力与客户满意度。
|
NoSQL 关系型数据库 BI
如何开发一套固定资产管理系统?(附架构图+流程图+代码参考)
固定资产管理涉及采购、入库、维修、盘点、报废等多个环节,是企业资产保值增值的关键。本文详解固定资产管理系统(FAMS)的核心功能、系统架构、资产全生命周期流程,并提供功能设计、开发实操技巧与关键代码示例,涵盖台账、申购、入库、报修、处置、盘点等重点模块。内容聚焦企业落地实践,帮助提升资产管理效率、降低风险、保障审计合规。
|
监控 供应链 前端开发
如何开发ERP(离散制造-MTO)系统中的财务管理板块(附架构图+流程图+代码参考)
本文详解离散制造MTO企业ERP系统中财务管理模块的搭建,聚焦应收账款与应付账款管理,涵盖核心功能、业务流程、开发技巧及Python代码示例,助力企业实现财务数据准确、实时可控,提升现金流管理能力。
1436 32

推荐镜像

更多