| <!doctype html> |
| <html lang="zh-CN" data-theme="light"> |
| <head> |
| <meta charset="utf-8" /> |
| <meta name="viewport" content="width=device-width,initial-scale=1" /> |
| <meta name="generator" content="VuePress 2.0.0-beta.66" /> |
| <meta name="theme" content="VuePress Theme Hope" /> |
| <meta property="og:url" content="https://iotdb.apache.org/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html"><meta property="og:site_name" content="IoTDB Website"><meta property="og:title" content="数据库编程"><meta property="og:description" content="触发器 使用说明 触发器提供了一种侦听序列数据变动的机制。配合用户自定义逻辑,可完成告警、数据转发等功能。 触发器基于 Java 反射机制实现。用户通过简单实现 Java 接口,即可实现数据侦听。IoTDB 允许用户动态注册、卸载触发器,在注册、卸载期间,无需启停服务器。 侦听模式 IoTDB 的单个触发器可用于侦听符合特定模式的时间序列的数据变动,如..."><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="og:updated_time" content="2023-07-31T08:42:16.000Z"><meta property="article:modified_time" content="2023-07-31T08:42:16.000Z"><script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"数据库编程","image":[""],"dateModified":"2023-07-31T08:42:16.000Z","author":[]}</script><link rel="icon" href="/favicon.ico"><meta name="Description" content="Apache IoTDB: Time Series Database for IoT"><meta name="Keywords" content="TSDB, time series, time series database, IoTDB, IoT database, IoT data management,时序数据库, 时间序列管理, IoTDB, 物联网数据库, 实时数据库, 物联网数据管理, 物联网数据"><meta name="baidu-site-verification" content="wfKETzB3OT"><meta name="google-site-verification" content="mZWAoRY0yj_HAr-s47zHCGHzx5Ju-RVm5wDbPnwQYFo"><title>数据库编程 | IoTDB Website</title><meta name="description" content="触发器 使用说明 触发器提供了一种侦听序列数据变动的机制。配合用户自定义逻辑,可完成告警、数据转发等功能。 触发器基于 Java 反射机制实现。用户通过简单实现 Java 接口,即可实现数据侦听。IoTDB 允许用户动态注册、卸载触发器,在注册、卸载期间,无需启停服务器。 侦听模式 IoTDB 的单个触发器可用于侦听符合特定模式的时间序列的数据变动,如..."> |
| <style> |
| :root { |
| --bg-color: #fff; |
| } |
| |
| html[data-theme="dark"] { |
| --bg-color: #1d1e1f; |
| } |
| |
| html, |
| body { |
| background: var(--bg-color); |
| } |
| </style> |
| <script> |
| const userMode = localStorage.getItem("vuepress-theme-hope-scheme"); |
| const systemDarkMode = |
| window.matchMedia && |
| window.matchMedia("(prefers-color-scheme: dark)").matches; |
| |
| if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) { |
| document.documentElement.setAttribute("data-theme", "dark"); |
| } |
| </script> |
| <link rel="preload" href="/assets/style-35dc1830.css" as="style"><link rel="stylesheet" href="/assets/style-35dc1830.css"> |
| <link rel="modulepreload" href="/assets/app-83ad958f.js"><link rel="modulepreload" href="/assets/Database-Programming.html-d03f0aef.js"><link rel="modulepreload" href="/assets/Database-Programming.html-2a6f5a96.js"> |
| </head> |
| <body> |
| <div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="vp-skip-link sr-only">跳至主要內容</a><!--]--><!--[--><div class="theme-container has-toc"><!--[--><header id="navbar" class="vp-navbar hide-icon"><div class="vp-navbar-start"><button type="button" class="vp-toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!--[--><!----><!--]--><!--[--><a class="vp-link vp-brand" href="/zh/"><img class="vp-nav-logo" src="/logo.png" alt="IoTDB Website"><!----><span class="vp-site-name hide-in-pad">IoTDB Website</span></a><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-center"><!--[--><!----><!--]--><!--[--><!--]--><!--[--><!----><!--]--></div><div class="vp-navbar-end"><!--[--><!----><!--]--><!--[--><div id="docsearch-container"></div><nav class="vp-nav-links"><div class="nav-item hide-in-mobile"><div class="dropdown-wrapper"><button type="button" class="dropdown-title" aria-label="文档"><span class="title"><!---->文档</span><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/UserGuide/V1.1.x/QuickStart/QuickStart.html"><!---->v1.1.x<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/UserGuide/V1.0.x/QuickStart/QuickStart.html"><!---->v1.0.x<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/UserGuide/V0.13.x/QuickStart/QuickStart.html"><!---->v0.13.x<!----></a></li></ul></button></div></div><div class="nav-item hide-in-mobile"><a href="https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=177051872" rel="noopener noreferrer" target="_blank" aria-label="系统设计" class="nav-link"><!---->系统设计<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="nav-item hide-in-mobile"><a class="vp-link nav-link" href="/zh/Download/"><!---->下载<!----></a></div><div class="nav-item hide-in-mobile"><div class="dropdown-wrapper"><button type="button" class="dropdown-title" aria-label="社区"><span class="title"><!---->社区</span><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/Community/About.html"><!---->关于社区<!----></a></li><li class="dropdown-item"><a href="https://cwiki.apache.org/confluence/display/iotdb" rel="noopener noreferrer" target="_blank" aria-label="Wiki" class="nav-link"><!---->Wiki<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/Community/Community-Project-Committers.html"><!---->开发人员<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/Community/Community-Powered-By.html"><!---->技术支持<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/Community/Materials.html"><!---->活动与报告<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/Community/Feedback.html"><!---->交流与反馈<!----></a></li></ul></button></div></div><div class="nav-item hide-in-mobile"><div class="dropdown-wrapper"><button type="button" class="dropdown-title" aria-label="开发"><span class="title"><!---->开发</span><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/Development/VoteRelease.html"><!---->如何投票<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/Development/HowToCommit.html"><!---->如何提交代码<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/Development/HowToJoin.html"><!---->成为Contributor<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/Development/Committer.html"><!---->成为Committer<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/Development/ContributeGuide.html"><!---->项目开发指南<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/Development/HowtoContributeCode.html"><!---->技术贡献指南<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/Development/format-changelist.html"><!---->TsFile的更改列表<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link" href="/zh/Development/rpc-changelist.html"><!---->RPC变更清单<!----></a></li></ul></button></div></div><div class="nav-item hide-in-mobile"><div class="dropdown-wrapper"><button type="button" class="dropdown-title" aria-label="ASF"><span class="title"><!---->ASF</span><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><a href="https://www.apache.org/" rel="noopener noreferrer" target="_blank" aria-label="基金会" class="nav-link"><!---->基金会<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li><li class="dropdown-item"><a href="https://www.apache.org/licenses/" rel="noopener noreferrer" target="_blank" aria-label="许可证" class="nav-link"><!---->许可证<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li><li class="dropdown-item"><a href="https://www.apache.org/security/" rel="noopener noreferrer" target="_blank" aria-label="安全" class="nav-link"><!---->安全<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li><li class="dropdown-item"><a href="https://www.apache.org/foundation/sponsorship.html" rel="noopener noreferrer" target="_blank" aria-label="赞助" class="nav-link"><!---->赞助<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li><li class="dropdown-item"><a href="https://www.apache.org/foundation/thanks.html" rel="noopener noreferrer" target="_blank" aria-label="致谢" class="nav-link"><!---->致谢<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li><li class="dropdown-item"><a href="https://www.apache.org/events/current-event" rel="noopener noreferrer" target="_blank" aria-label="活动" class="nav-link"><!---->活动<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></li></ul></button></div></div></nav><div class="nav-item"><div class="dropdown-wrapper i18n-dropdown"><button type="button" class="dropdown-title" aria-label="选择语言"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon i18n-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="i18n icon" style="width:1rem;height:1rem;vertical-align:middle;"><path d="M379.392 460.8 494.08 575.488l-42.496 102.4L307.2 532.48 138.24 701.44l-71.68-72.704L234.496 460.8l-45.056-45.056c-27.136-27.136-51.2-66.56-66.56-108.544h112.64c7.68 14.336 16.896 27.136 26.112 35.84l45.568 46.08 45.056-45.056C382.976 312.32 409.6 247.808 409.6 204.8H0V102.4h256V0h102.4v102.4h256v102.4H512c0 70.144-37.888 161.28-87.04 210.944L378.88 460.8zM576 870.4 512 1024H409.6l256-614.4H768l256 614.4H921.6l-64-153.6H576zM618.496 768h196.608L716.8 532.48 618.496 768z"></path></svg><!--]--><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><a class="vp-link nav-link" href="/"><!---->English<!----></a></li><li class="dropdown-item"><a class="vp-link nav-link active" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html"><!---->简体中文<!----></a></li></ul></button></div></div><div class="nav-item hide-in-mobile"><button type="button" id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><div class="nav-item vp-repo"><a class="vp-repo-link" href="https://github.com/apache/iotdb" target="_blank" rel="noopener noreferrer" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="icon github-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="github icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M511.957 21.333C241.024 21.333 21.333 240.981 21.333 512c0 216.832 140.544 400.725 335.574 465.664 24.49 4.395 32.256-10.07 32.256-23.083 0-11.69.256-44.245 0-85.205-136.448 29.61-164.736-64.64-164.736-64.64-22.315-56.704-54.4-71.765-54.4-71.765-44.587-30.464 3.285-29.824 3.285-29.824 49.195 3.413 75.179 50.517 75.179 50.517 43.776 75.008 114.816 53.333 142.762 40.79 4.523-31.66 17.152-53.377 31.19-65.537-108.971-12.458-223.488-54.485-223.488-242.602 0-53.547 19.114-97.323 50.517-131.67-5.035-12.33-21.93-62.293 4.779-129.834 0 0 41.258-13.184 134.912 50.346a469.803 469.803 0 0 1 122.88-16.554c41.642.213 83.626 5.632 122.88 16.554 93.653-63.488 134.784-50.346 134.784-50.346 26.752 67.541 9.898 117.504 4.864 129.834 31.402 34.347 50.474 78.123 50.474 131.67 0 188.586-114.73 230.016-224.042 242.09 17.578 15.232 33.578 44.672 33.578 90.454v135.85c0 13.142 7.936 27.606 32.854 22.87C862.25 912.597 1002.667 728.747 1002.667 512c0-271.019-219.648-490.667-490.71-490.667z"></path></svg></a></div><!--]--><!--[--><!----><!--]--><button type="button" class="vp-toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span><span class="vp-top"></span><span class="vp-middle"></span><span class="vp-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow start"></span></div><aside id="sidebar" class="vp-sidebar"><!--[--><!----><!--]--><ul class="vp-sidebar-links"><li><section class="vp-sidebar-group"><p class="vp-sidebar-heading"><!----><span class="vp-sidebar-title">IoTDB用户手册 (V1.2.x)</span><!----></p><ul class="vp-sidebar-links"></ul></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">关于IoTDB</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">快速上手</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">基础概念</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">部署与运维</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable active" type="button"><!----><span class="vp-sidebar-title">使用手册</span><span class="vp-arrow down"></span></button><ul class="vp-sidebar-links"><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/zh/UserGuide/V1.2.x/User-Manuel/Syntax-Rule.html"><!---->语法约定<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/zh/UserGuide/V1.2.x/User-Manuel/Operate-Metadata.html"><!---->元数据管理<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/zh/UserGuide/V1.2.x/User-Manuel/Write-Delete-Data.html"><!---->数据增删<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/zh/UserGuide/V1.2.x/User-Manuel/Query-Data.html"><!---->数据查询<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/zh/UserGuide/V1.2.x/User-Manuel/Operator-and-Expression.html"><!---->运算符和表达式<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a class="vp-link nav-link active vp-sidebar-link vp-sidebar-page active" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html"><!---->数据库编程<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#触发器"><!---->触发器<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#使用说明"><!---->使用说明<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#编写触发器"><!---->编写触发器<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#管理触发器"><!---->管理触发器<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#重要注意事项"><!---->重要注意事项<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#配置参数"><!---->配置参数<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#连续查询-continuous-query-cq"><!---->连续查询(Continuous Query, CQ)<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#简介"><!---->简介<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#语法"><!---->语法<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#连续查询的用例"><!---->连续查询的用例<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#连续查询的管理"><!---->连续查询的管理<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#连续查询的使用场景"><!---->连续查询的使用场景<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#连续查询相关的配置参数"><!---->连续查询相关的配置参数<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#用户自定义函数"><!---->用户自定义函数<!----></a><ul class="vp-sidebar-sub-headers"><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#数据质量函数"><!---->数据质量函数<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#趋势计算函数"><!---->趋势计算函数<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#采样函数"><!---->采样函数<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#选择函数"><!---->选择函数<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#数据画像"><!---->数据画像<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#异常检测"><!---->异常检测<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#频域分析"><!---->频域分析<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#数据匹配"><!---->数据匹配<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#数据修复"><!---->数据修复<!----></a><ul class="vp-sidebar-sub-headers"></ul></li><li class="vp-sidebar-sub-header"><a class="vp-link nav-link vp-sidebar-link vp-heading" href="/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.html#序列发现"><!---->序列发现<!----></a><ul class="vp-sidebar-sub-headers"></ul></li></ul></li></ul><!--]--></li><li><!--[--><a class="vp-link nav-link vp-sidebar-link vp-sidebar-page" href="/zh/UserGuide/V1.2.x/User-Manuel/Authority-Management.html"><!---->权限管理<!----></a><ul class="vp-sidebar-sub-headers"></ul><!--]--></li></ul></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">工具体系</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">应用编程接口</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">系统集成</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">SQL手册</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">FAQ</span><span class="vp-arrow end"></span></button><!----></section></li><li><section class="vp-sidebar-group"><button class="vp-sidebar-heading clickable" type="button"><!----><span class="vp-sidebar-title">参考</span><span class="vp-arrow end"></span></button><!----></section></li></ul><!--[--><!----><!--]--></aside><!--[--><main id="main-content" class="vp-page"><!--[--><!----><!----><nav class="vp-breadcrumb disable"></nav><div class="vp-page-title"><h1><!---->数据库编程</h1><div class="page-info"><!----><!----><span class="page-date-info" aria-label="写作日期"><svg xmlns="http://www.w3.org/2000/svg" class="icon calendar-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="calendar icon"><path d="M716.4 110.137c0-18.753-14.72-33.473-33.472-33.473-18.753 0-33.473 14.72-33.473 33.473v33.473h66.993v-33.473zm-334.87 0c0-18.753-14.72-33.473-33.473-33.473s-33.52 14.72-33.52 33.473v33.473h66.993v-33.473zm468.81 33.52H716.4v100.465c0 18.753-14.72 33.473-33.472 33.473a33.145 33.145 0 01-33.473-33.473V143.657H381.53v100.465c0 18.753-14.72 33.473-33.473 33.473a33.145 33.145 0 01-33.473-33.473V143.657H180.6A134.314 134.314 0 0046.66 277.595v535.756A134.314 134.314 0 00180.6 947.289h669.74a134.36 134.36 0 00133.94-133.938V277.595a134.314 134.314 0 00-133.94-133.938zm33.473 267.877H147.126a33.145 33.145 0 01-33.473-33.473c0-18.752 14.72-33.473 33.473-33.473h736.687c18.752 0 33.472 14.72 33.472 33.473a33.145 33.145 0 01-33.472 33.473z"></path></svg><span><!----></span><meta property="datePublished" content="2023-07-31T08:42:16.000Z"></span><!----><span class="page-reading-time-info" aria-label="阅读时间"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 142 分钟</span><meta property="timeRequired" content="PT142M"></span><!----><!----></div><hr></div><div class="toc-place-holder"><aside id="toc"><!--[--><!----><!--]--><div class="toc-header">此页内容<button type="button" class="print-button" title="打印"><svg xmlns="http://www.w3.org/2000/svg" class="icon print-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="print icon"><path d="M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"></path></svg></button></div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level2" href="/#触发器">触发器</a></li><li><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#使用说明">使用说明</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#编写触发器">编写触发器</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#管理触发器">管理触发器</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#重要注意事项">重要注意事项</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#配置参数">配置参数</a></li><!----><!--]--></ul></li><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2" href="/#连续查询-continuous-query-cq">连续查询(Continuous Query, CQ)</a></li><li><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#简介">简介</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#语法">语法</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#连续查询的用例">连续查询的用例</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#连续查询的管理">连续查询的管理</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#连续查询的使用场景">连续查询的使用场景</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#连续查询相关的配置参数">连续查询相关的配置参数</a></li><!----><!--]--></ul></li><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level2" href="/#用户自定义函数">用户自定义函数</a></li><li><ul class="toc-list"><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#数据质量函数">数据质量函数</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#趋势计算函数">趋势计算函数</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#采样函数">采样函数</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#选择函数">选择函数</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#数据画像">数据画像</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#异常检测">异常检测</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#频域分析">频域分析</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#数据匹配">数据匹配</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#数据修复">数据修复</a></li><!----><!--]--><!--[--><li class="toc-item"><a class="vp-link toc-link level3" href="/#序列发现">序列发现</a></li><!----><!--]--></ul></li><!--]--></ul><div class="toc-marker" style="top:-1.7rem;"></div></div><!--[--><!----><!--]--></aside></div><!----><div class="theme-hope-content"><!-- |
| |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| |
| --><h1 id="数据库编程" tabindex="-1"><a class="header-anchor" href="#数据库编程" aria-hidden="true">#</a> 数据库编程</h1><h2 id="触发器" tabindex="-1"><a class="header-anchor" href="#触发器" aria-hidden="true">#</a> 触发器</h2><h3 id="使用说明" tabindex="-1"><a class="header-anchor" href="#使用说明" aria-hidden="true">#</a> 使用说明</h3><p>触发器提供了一种侦听序列数据变动的机制。配合用户自定义逻辑,可完成告警、数据转发等功能。</p><p>触发器基于 Java 反射机制实现。用户通过简单实现 Java 接口,即可实现数据侦听。IoTDB 允许用户动态注册、卸载触发器,在注册、卸载期间,无需启停服务器。</p><h4 id="侦听模式" tabindex="-1"><a class="header-anchor" href="#侦听模式" aria-hidden="true">#</a> 侦听模式</h4><p>IoTDB 的单个触发器可用于侦听符合特定模式的时间序列的数据变动,如时间序列 root.sg.a 上的数据变动,或者符合路径模式 root.**.a 的时间序列上的数据变动。您在注册触发器时可以通过 SQL 语句指定触发器侦听的路径模式。</p><h4 id="触发器类型" tabindex="-1"><a class="header-anchor" href="#触发器类型" aria-hidden="true">#</a> 触发器类型</h4><p>目前触发器分为两类,您在注册触发器时可以通过 SQL 语句指定类型:</p><ul><li>有状态的触发器。该类触发器的执行逻辑可能依赖前后的多条数据,框架会将不同节点写入的数据汇总到同一个触发器实例进行计算,来保留上下文信息,通常用于采样或者统计一段时间的数据聚合信息。集群中只有一个节点持有有状态触发器的实例。</li><li>无状态的触发器。触发器的执行逻辑只和当前输入的数据有关,框架无需将不同节点的数据汇总到同一个触发器实例中,通常用于单行数据的计算和异常检测等。集群中每个节点均持有无状态触发器的实例。</li></ul><h4 id="触发时机" tabindex="-1"><a class="header-anchor" href="#触发时机" aria-hidden="true">#</a> 触发时机</h4><p>触发器的触发时机目前有两种,后续会拓展其它触发时机。您在注册触发器时可以通过 SQL 语句指定触发时机:</p><ul><li>BEFORE INSERT,即在数据持久化之前触发。请注意,目前触发器并不支持数据清洗,不会对要持久化的数据本身进行变动。</li><li>AFTER INSERT,即在数据持久化之后触发。</li></ul><h3 id="编写触发器" tabindex="-1"><a class="header-anchor" href="#编写触发器" aria-hidden="true">#</a> 编写触发器</h3><h4 id="触发器依赖" tabindex="-1"><a class="header-anchor" href="#触发器依赖" aria-hidden="true">#</a> 触发器依赖</h4><p>触发器的逻辑需要您编写 Java 类进行实现。<br> 在编写触发器逻辑时,需要使用到下面展示的依赖。如果您使用 <a href="http://search.maven.org/" target="_blank" rel="noopener noreferrer">Maven<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a>,则可以直接从 <a href="http://search.maven.org/" target="_blank" rel="noopener noreferrer">Maven 库<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a>中搜索到它们。请注意选择和目标服务器版本相同的依赖版本。</p><div class="language-xml line-numbers-mode" data-ext="xml"><pre class="language-xml"><code><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> |
| <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.apache.iotdb<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> |
| <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>iotdb-server<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> |
| <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> |
| <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>scope</span><span class="token punctuation">></span></span>provided<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>scope</span><span class="token punctuation">></span></span> |
| <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="接口说明" tabindex="-1"><a class="header-anchor" href="#接口说明" aria-hidden="true">#</a> 接口说明</h4><p>编写一个触发器需要实现 <code>org.apache.iotdb.trigger.api.Trigger</code> 类。</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>api<span class="token punctuation">.</span>enums<span class="token punctuation">.</span></span><span class="token class-name">FailureStrategy</span></span><span class="token punctuation">;</span> |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>write<span class="token punctuation">.</span>record<span class="token punctuation">.</span></span><span class="token class-name">Tablet</span></span><span class="token punctuation">;</span> |
| |
| <span class="token keyword">public</span> <span class="token keyword">interface</span> <span class="token class-name">Trigger</span> <span class="token punctuation">{</span> |
| |
| <span class="token doc-comment comment">/** |
| * This method is mainly used to validate <span class="token punctuation">{</span><span class="token keyword">@link</span> <span class="token reference"><span class="token class-name">TriggerAttributes</span></span><span class="token punctuation">}</span> before calling <span class="token punctuation">{</span><span class="token keyword">@link</span> |
| * <span class="token reference"><span class="token class-name">Trigger</span><span class="token punctuation">#</span><span class="token function">onCreate</span><span class="token punctuation">(</span><span class="token class-name">TriggerAttributes</span><span class="token punctuation">)</span></span><span class="token punctuation">}</span>. |
| * |
| * <span class="token keyword">@param</span> <span class="token parameter">attributes</span> TriggerAttributes |
| * <span class="token keyword">@throws</span> <span class="token reference"><span class="token class-name">Exception</span></span> e |
| */</span> |
| <span class="token keyword">default</span> <span class="token keyword">void</span> <span class="token function">validate</span><span class="token punctuation">(</span><span class="token class-name">TriggerAttributes</span> attributes<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> |
| |
| <span class="token doc-comment comment">/** |
| * This method will be called when creating a trigger after validation. |
| * |
| * <span class="token keyword">@param</span> <span class="token parameter">attributes</span> TriggerAttributes |
| * <span class="token keyword">@throws</span> <span class="token reference"><span class="token class-name">Exception</span></span> e |
| */</span> |
| <span class="token keyword">default</span> <span class="token keyword">void</span> <span class="token function">onCreate</span><span class="token punctuation">(</span><span class="token class-name">TriggerAttributes</span> attributes<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> |
| |
| <span class="token doc-comment comment">/** |
| * This method will be called when dropping a trigger. |
| * |
| * <span class="token keyword">@throws</span> <span class="token reference"><span class="token class-name">Exception</span></span> e |
| */</span> |
| <span class="token keyword">default</span> <span class="token keyword">void</span> <span class="token function">onDrop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> |
| |
| <span class="token doc-comment comment">/** |
| * When restarting a DataNode, Triggers that have been registered will be restored and this method |
| * will be called during the process of restoring. |
| * |
| * <span class="token keyword">@throws</span> <span class="token reference"><span class="token class-name">Exception</span></span> e |
| */</span> |
| <span class="token keyword">default</span> <span class="token keyword">void</span> <span class="token function">restore</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span><span class="token punctuation">}</span> |
| |
| <span class="token doc-comment comment">/** |
| * Overrides this method to set the expected FailureStrategy, <span class="token punctuation">{</span><span class="token keyword">@link</span> <span class="token reference"><span class="token class-name">FailureStrategy</span><span class="token punctuation">#</span><span class="token field">OPTIMISTIC</span></span><span class="token punctuation">}</span> |
| * is the default strategy. |
| * |
| * <span class="token keyword">@return</span> <span class="token punctuation">{</span><span class="token keyword">@link</span> <span class="token reference"><span class="token class-name">FailureStrategy</span></span><span class="token punctuation">}</span> |
| */</span> |
| <span class="token keyword">default</span> <span class="token class-name">FailureStrategy</span> <span class="token function">getFailureStrategy</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> |
| <span class="token keyword">return</span> <span class="token class-name">FailureStrategy</span><span class="token punctuation">.</span><span class="token constant">OPTIMISTIC</span><span class="token punctuation">;</span> |
| <span class="token punctuation">}</span> |
| |
| <span class="token doc-comment comment">/** |
| * <span class="token keyword">@param</span> <span class="token parameter">tablet</span> see <span class="token punctuation">{</span><span class="token keyword">@link</span> <span class="token reference"><span class="token class-name">Tablet</span></span><span class="token punctuation">}</span> for detailed information of data structure. Data that is |
| * inserted will be constructed as a Tablet and you can define process logic with <span class="token punctuation">{</span><span class="token keyword">@link</span> |
| * <span class="token reference"><span class="token class-name">Tablet</span></span><span class="token punctuation">}</span>. |
| * <span class="token keyword">@return</span> true if successfully fired |
| * <span class="token keyword">@throws</span> <span class="token reference"><span class="token class-name">Exception</span></span> e |
| */</span> |
| <span class="token keyword">default</span> <span class="token keyword">boolean</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token class-name">Tablet</span> tablet<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span> |
| <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> |
| <span class="token punctuation">}</span> |
| <span class="token punctuation">}</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>该类主要提供了两类编程接口:<strong>生命周期相关接口</strong>和<strong>数据变动侦听相关接口</strong>。该类中所有的接口都不是必须实现的,当您不实现它们时,它们不会对流经的数据操作产生任何响应。您可以根据实际需要,只实现其中若干接口。</p><p>下面是所有可供用户进行实现的接口的说明。</p><h5 id="生命周期相关接口" tabindex="-1"><a class="header-anchor" href="#生命周期相关接口" aria-hidden="true">#</a> 生命周期相关接口</h5><table><thead><tr><th>接口定义</th><th>描述</th></tr></thead><tbody><tr><td><em>default void validate(TriggerAttributes attributes) throws Exception {}</em></td><td>用户在使用 <code>CREATE TRIGGER</code> 语句创建触发器时,可以指定触发器需要使用的参数,该接口会用于验证参数正确性。</td></tr><tr><td><em>default void onCreate(TriggerAttributes attributes) throws Exception {}</em></td><td>当您使用<code>CREATE TRIGGER</code>语句创建触发器后,该接口会被调用一次。在每一个触发器实例的生命周期内,该接口会且仅会被调用一次。该接口主要有如下作用:帮助用户解析 SQL 语句中的自定义属性(使用<code>TriggerAttributes</code>)。 可以创建或申请资源,如建立外部链接、打开文件等。</td></tr><tr><td><em>default void onDrop() throws Exception {}</em></td><td>当您使用<code>DROP TRIGGER</code>语句删除触发器后,该接口会被调用。在每一个触发器实例的生命周期内,该接口会且仅会被调用一次。该接口主要有如下作用:可以进行资源释放的操作。可以用于持久化触发器计算的结果。</td></tr><tr><td><em>default void restore() throws Exception {}</em></td><td>当重启 DataNode 时,集群会恢复 DataNode 上已经注册的触发器实例,在此过程中会为该 DataNode 上的有状态触发器调用一次该接口。有状态触发器实例所在的 DataNode 宕机后,集群会在另一个可用 DataNode 上恢复该触发器的实例,在此过程中会调用一次该接口。该接口可以用于自定义恢复逻辑。</td></tr></tbody></table><h5 id="数据变动侦听相关接口" tabindex="-1"><a class="header-anchor" href="#数据变动侦听相关接口" aria-hidden="true">#</a> 数据变动侦听相关接口</h5><h6 id="侦听接口" tabindex="-1"><a class="header-anchor" href="#侦听接口" aria-hidden="true">#</a> 侦听接口</h6><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code> <span class="token doc-comment comment">/** |
| * <span class="token keyword">@param</span> <span class="token parameter">tablet</span> see <span class="token punctuation">{</span><span class="token keyword">@link</span> <span class="token reference"><span class="token class-name">Tablet</span></span><span class="token punctuation">}</span> for detailed information of data structure. Data that is |
| * inserted will be constructed as a Tablet and you can define process logic with <span class="token punctuation">{</span><span class="token keyword">@link</span> |
| * <span class="token reference"><span class="token class-name">Tablet</span></span><span class="token punctuation">}</span>. |
| * <span class="token keyword">@return</span> true if successfully fired |
| * <span class="token keyword">@throws</span> <span class="token reference"><span class="token class-name">Exception</span></span> e |
| */</span> |
| <span class="token keyword">default</span> <span class="token keyword">boolean</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token class-name">Tablet</span> tablet<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span> |
| <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> |
| <span class="token punctuation">}</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>数据变动时,触发器以 Tablet 作为触发操作的单位。您可以通过 Tablet 获取相应序列的元数据和数据,然后进行相应的触发操作,触发成功则返回值应当为 true。该接口返回 false 或是抛出异常我们均认为触发失败。在触发失败时,我们会根据侦听策略接口进行相应的操作。</p><p>进行一次 INSERT 操作时,对于其中的每条时间序列,我们会检测是否有侦听该路径模式的触发器,然后将符合同一个触发器所侦听的路径模式的时间序列数据组装成一个新的 Tablet 用于触发器的 fire 接口。可以理解成:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token class-name">Map</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">PartialPath</span><span class="token punctuation">,</span> <span class="token class-name">List</span><span class="token punctuation"><</span><span class="token class-name">Trigger</span><span class="token punctuation">></span><span class="token punctuation">></span></span> pathToTriggerListMap <span class="token operator">=</span><span class="token operator">></span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">Trigger</span><span class="token punctuation">,</span> <span class="token class-name">Tablet</span><span class="token punctuation">></span></span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p><strong>请注意,目前我们不对触发器的触发顺序有任何保证。</strong></p><p>下面是示例:</p><p>假设有三个触发器,触发器的触发时机均为 BEFORE INSERT</p><ul><li>触发器 Trigger1 侦听路径模式:<a href="http://root.sg" target="_blank" rel="noopener noreferrer">root.sg<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a>.*</li><li>触发器 Trigger2 侦听路径模式:root.sg.a</li><li>触发器 Trigger3 侦听路径模式:root.sg.b</li></ul><p>写入语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">insert</span> <span class="token keyword">into</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">(</span><span class="token keyword">time</span><span class="token punctuation">,</span> a<span class="token punctuation">,</span> b<span class="token punctuation">)</span> <span class="token keyword">values</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>序列 root.sg.a 匹配 Trigger1 和 Trigger2,序列 root.sg.b 匹配 Trigger1 和 Trigger3,那么:</p><ul><li>root.sg.a 和 root.sg.b 的数据会被组装成一个新的 tablet1,在相应的触发时机进行 Trigger1.fire(tablet1)</li><li>root.sg.a 的数据会被组装成一个新的 tablet2,在相应的触发时机进行 Trigger2.fire(tablet2)</li><li>root.sg.b 的数据会被组装成一个新的 tablet3,在相应的触发时机进行 Trigger3.fire(tablet3)</li></ul><h6 id="侦听策略接口" tabindex="-1"><a class="header-anchor" href="#侦听策略接口" aria-hidden="true">#</a> 侦听策略接口</h6><p>在触发器触发失败时,我们会根据侦听策略接口设置的策略进行相应的操作,您可以通过下述接口设置 <code>org.apache.iotdb.trigger.api.enums.FailureStrategy</code>,目前有乐观和悲观两种策略:</p><ul><li>乐观策略:触发失败的触发器不影响后续触发器的触发,也不影响写入流程,即我们不对触发失败涉及的序列做额外处理,仅打日志记录失败,最后返回用户写入数据成功,但触发部分失败。</li><li>悲观策略:失败触发器影响后续所有 Pipeline 的处理,即我们认为该 Trigger 触发失败会导致后续所有触发流程不再进行。如果该触发器的触发时机为 BEFORE INSERT,那么写入也不再进行,直接返回写入失败。</li></ul><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code> <span class="token doc-comment comment">/** |
| * Overrides this method to set the expected FailureStrategy, <span class="token punctuation">{</span><span class="token keyword">@link</span> <span class="token reference"><span class="token class-name">FailureStrategy</span><span class="token punctuation">#</span><span class="token field">OPTIMISTIC</span></span><span class="token punctuation">}</span> |
| * is the default strategy. |
| * |
| * <span class="token keyword">@return</span> <span class="token punctuation">{</span><span class="token keyword">@link</span> <span class="token reference"><span class="token class-name">FailureStrategy</span></span><span class="token punctuation">}</span> |
| */</span> |
| <span class="token keyword">default</span> <span class="token class-name">FailureStrategy</span> <span class="token function">getFailureStrategy</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> |
| <span class="token keyword">return</span> <span class="token class-name">FailureStrategy</span><span class="token punctuation">.</span><span class="token constant">OPTIMISTIC</span><span class="token punctuation">;</span> |
| <span class="token punctuation">}</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>您可以参考下图辅助理解,其中 Trigger1 配置采用乐观策略,Trigger2 配置采用悲观策略。Trigger1 和 Trigger2 的触发时机是 BEFORE INSERT,Trigger3 和 Trigger4 的触发时机是 AFTER INSERT。 正常执行流程如下:</p><img src="https://alioss.timecho.com/docs/img/UserGuide/Process-Data/Triggers/Trigger_Process_Flow.jpg?raw=true"><img src="https://alioss.timecho.com/docs/img/UserGuide/Process-Data/Triggers/Trigger_Process_Strategy.jpg?raw=true"><h4 id="示例" tabindex="-1"><a class="header-anchor" href="#示例" aria-hidden="true">#</a> 示例</h4><p>如果您使用 <a href="http://search.maven.org/" target="_blank" rel="noopener noreferrer">Maven<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a>,可以参考我们编写的示例项目 trigger-example。您可以在 <a href="https://github.com/apache/iotdb/tree/master/example/trigger" target="_blank" rel="noopener noreferrer">这里<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a> 找到它。后续我们会加入更多的示例项目供您参考。</p><p>下面是其中一个示例项目的代码:</p><div class="language-java line-numbers-mode" data-ext="java"><pre class="language-java"><code><span class="token comment">/* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */</span> |
| |
| <span class="token keyword">package</span> <span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>trigger</span><span class="token punctuation">;</span> |
| |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>engine<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>sink<span class="token punctuation">.</span>alertmanager<span class="token punctuation">.</span></span><span class="token class-name">AlertManagerConfiguration</span></span><span class="token punctuation">;</span> |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>engine<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>sink<span class="token punctuation">.</span>alertmanager<span class="token punctuation">.</span></span><span class="token class-name">AlertManagerEvent</span></span><span class="token punctuation">;</span> |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>db<span class="token punctuation">.</span>engine<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>sink<span class="token punctuation">.</span>alertmanager<span class="token punctuation">.</span></span><span class="token class-name">AlertManagerHandler</span></span><span class="token punctuation">;</span> |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>api<span class="token punctuation">.</span></span><span class="token class-name">Trigger</span></span><span class="token punctuation">;</span> |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>trigger<span class="token punctuation">.</span>api<span class="token punctuation">.</span></span><span class="token class-name">TriggerAttributes</span></span><span class="token punctuation">;</span> |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>file<span class="token punctuation">.</span>metadata<span class="token punctuation">.</span>enums<span class="token punctuation">.</span></span><span class="token class-name">TSDataType</span></span><span class="token punctuation">;</span> |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>write<span class="token punctuation">.</span>record<span class="token punctuation">.</span></span><span class="token class-name">Tablet</span></span><span class="token punctuation">;</span> |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>iotdb<span class="token punctuation">.</span>tsfile<span class="token punctuation">.</span>write<span class="token punctuation">.</span>schema<span class="token punctuation">.</span></span><span class="token class-name">MeasurementSchema</span></span><span class="token punctuation">;</span> |
| |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>slf4j<span class="token punctuation">.</span></span><span class="token class-name">Logger</span></span><span class="token punctuation">;</span> |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">org<span class="token punctuation">.</span>slf4j<span class="token punctuation">.</span></span><span class="token class-name">LoggerFactory</span></span><span class="token punctuation">;</span> |
| |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>io<span class="token punctuation">.</span></span><span class="token class-name">IOException</span></span><span class="token punctuation">;</span> |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">HashMap</span></span><span class="token punctuation">;</span> |
| <span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token class-name">List</span></span><span class="token punctuation">;</span> |
| |
| <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ClusterAlertingExample</span> <span class="token keyword">implements</span> <span class="token class-name">Trigger</span> <span class="token punctuation">{</span> |
| <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token class-name">Logger</span> <span class="token constant">LOGGER</span> <span class="token operator">=</span> <span class="token class-name">LoggerFactory</span><span class="token punctuation">.</span><span class="token function">getLogger</span><span class="token punctuation">(</span><span class="token class-name">ClusterAlertingExample</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| |
| <span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">AlertManagerHandler</span> alertManagerHandler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">AlertManagerHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| |
| <span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">AlertManagerConfiguration</span> alertManagerConfiguration <span class="token operator">=</span> |
| <span class="token keyword">new</span> <span class="token class-name">AlertManagerConfiguration</span><span class="token punctuation">(</span><span class="token string">"http://127.0.0.1:9093/api/v2/alerts"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| |
| <span class="token keyword">private</span> <span class="token class-name">String</span> alertname<span class="token punctuation">;</span> |
| |
| <span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">></span></span> labels <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| |
| <span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">></span></span> annotations <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token generics"><span class="token punctuation"><</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| |
| <span class="token annotation punctuation">@Override</span> |
| <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onCreate</span><span class="token punctuation">(</span><span class="token class-name">TriggerAttributes</span> attributes<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span> |
| alertname <span class="token operator">=</span> <span class="token string">"alert_test"</span><span class="token punctuation">;</span> |
| |
| labels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"series"</span><span class="token punctuation">,</span> <span class="token string">"root.ln.wf01.wt01.temperature"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| labels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"value"</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| labels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"severity"</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| |
| annotations<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"summary"</span><span class="token punctuation">,</span> <span class="token string">"high temperature"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| annotations<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"description"</span><span class="token punctuation">,</span> <span class="token string">"{{.alertname}}: {{.series}} is {{.value}}"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| |
| alertManagerHandler<span class="token punctuation">.</span><span class="token keyword">open</span><span class="token punctuation">(</span>alertManagerConfiguration<span class="token punctuation">)</span><span class="token punctuation">;</span> |
| <span class="token punctuation">}</span> |
| |
| <span class="token annotation punctuation">@Override</span> |
| <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">onDrop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span> <span class="token punctuation">{</span> |
| alertManagerHandler<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| <span class="token punctuation">}</span> |
| |
| <span class="token annotation punctuation">@Override</span> |
| <span class="token keyword">public</span> <span class="token keyword">boolean</span> <span class="token function">fire</span><span class="token punctuation">(</span><span class="token class-name">Tablet</span> tablet<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">Exception</span> <span class="token punctuation">{</span> |
| <span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">MeasurementSchema</span><span class="token punctuation">></span></span> measurementSchemaList <span class="token operator">=</span> tablet<span class="token punctuation">.</span><span class="token function">getSchemas</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> n <span class="token operator">=</span> measurementSchemaList<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator"><</span> n<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> |
| <span class="token keyword">if</span> <span class="token punctuation">(</span>measurementSchemaList<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getType</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span><span class="token class-name">TSDataType</span><span class="token punctuation">.</span><span class="token constant">DOUBLE</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> |
| <span class="token comment">// for example, we only deal with the columns of Double type</span> |
| <span class="token keyword">double</span><span class="token punctuation">[</span><span class="token punctuation">]</span> values <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">double</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> tablet<span class="token punctuation">.</span>values<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> |
| <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">double</span> value <span class="token operator">:</span> values<span class="token punctuation">)</span> <span class="token punctuation">{</span> |
| <span class="token keyword">if</span> <span class="token punctuation">(</span>value <span class="token operator">></span> <span class="token number">100.0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> |
| <span class="token constant">LOGGER</span><span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"trigger value > 100"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| labels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"value"</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| labels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"severity"</span><span class="token punctuation">,</span> <span class="token string">"critical"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| <span class="token class-name">AlertManagerEvent</span> alertManagerEvent <span class="token operator">=</span> |
| <span class="token keyword">new</span> <span class="token class-name">AlertManagerEvent</span><span class="token punctuation">(</span>alertname<span class="token punctuation">,</span> labels<span class="token punctuation">,</span> annotations<span class="token punctuation">)</span><span class="token punctuation">;</span> |
| alertManagerHandler<span class="token punctuation">.</span><span class="token function">onEvent</span><span class="token punctuation">(</span>alertManagerEvent<span class="token punctuation">)</span><span class="token punctuation">;</span> |
| <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>value <span class="token operator">></span> <span class="token number">50.0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> |
| <span class="token constant">LOGGER</span><span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"trigger value > 50"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| labels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"value"</span><span class="token punctuation">,</span> <span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| labels<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"severity"</span><span class="token punctuation">,</span> <span class="token string">"warning"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| <span class="token class-name">AlertManagerEvent</span> alertManagerEvent <span class="token operator">=</span> |
| <span class="token keyword">new</span> <span class="token class-name">AlertManagerEvent</span><span class="token punctuation">(</span>alertname<span class="token punctuation">,</span> labels<span class="token punctuation">,</span> annotations<span class="token punctuation">)</span><span class="token punctuation">;</span> |
| alertManagerHandler<span class="token punctuation">.</span><span class="token function">onEvent</span><span class="token punctuation">(</span>alertManagerEvent<span class="token punctuation">)</span><span class="token punctuation">;</span> |
| <span class="token punctuation">}</span> |
| <span class="token punctuation">}</span> |
| <span class="token punctuation">}</span> |
| <span class="token punctuation">}</span> |
| <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span> |
| <span class="token punctuation">}</span> |
| <span class="token punctuation">}</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="管理触发器" tabindex="-1"><a class="header-anchor" href="#管理触发器" aria-hidden="true">#</a> 管理触发器</h3><p>您可以通过 SQL 语句注册和卸载一个触发器实例,您也可以通过 SQL 语句查询到所有已经注册的触发器。</p><p><strong>我们建议您在注册触发器时停止写入。</strong></p><h4 id="注册触发器" tabindex="-1"><a class="header-anchor" href="#注册触发器" aria-hidden="true">#</a> 注册触发器</h4><p>触发器可以注册在任意路径模式上。被注册有触发器的序列将会被触发器侦听,当序列上有数据变动时,触发器中对应的触发方法将会被调用。</p><p>注册一个触发器可以按如下流程进行:</p><ol><li>按照编写触发器章节的说明,实现一个完整的 Trigger 类,假定这个类的全类名为 <code>org.apache.iotdb.trigger.ClusterAlertingExample</code></li><li>将项目打成 JAR 包。</li><li>使用 SQL 语句注册该触发器。注册过程中会仅只会调用一次触发器的 <code>validate</code> 和 <code>onCreate</code> 接口,具体请参考编写触发器章节。</li></ol><p>完整 SQL 语法如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token comment">// Create Trigger</span> |
| createTrigger |
| : <span class="token keyword">CREATE</span> triggerType <span class="token keyword">TRIGGER</span> triggerName<span class="token operator">=</span>identifier triggerEventClause <span class="token keyword">ON</span> pathPattern <span class="token keyword">AS</span> className<span class="token operator">=</span>STRING_LITERAL uriClause? triggerAttributeClause? |
| <span class="token punctuation">;</span> |
| |
| triggerType |
| : STATELESS <span class="token operator">|</span> STATEFUL |
| <span class="token punctuation">;</span> |
| |
| triggerEventClause |
| : <span class="token punctuation">(</span>BEFORE <span class="token operator">|</span> <span class="token keyword">AFTER</span><span class="token punctuation">)</span> <span class="token keyword">INSERT</span> |
| <span class="token punctuation">;</span> |
| |
| uriClause |
| : <span class="token keyword">USING</span> URI uri |
| <span class="token punctuation">;</span> |
| |
| uri |
| : STRING_LITERAL |
| <span class="token punctuation">;</span> |
| |
| triggerAttributeClause |
| : <span class="token keyword">WITH</span> LR_BRACKET triggerAttribute <span class="token punctuation">(</span>COMMA triggerAttribute<span class="token punctuation">)</span><span class="token operator">*</span> RR_BRACKET |
| <span class="token punctuation">;</span> |
| |
| triggerAttribute |
| : <span class="token keyword">key</span><span class="token operator">=</span>attributeKey operator_eq <span class="token keyword">value</span><span class="token operator">=</span>attributeValue |
| <span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>下面对 SQL 语法进行说明,您可以结合使用说明章节进行理解:</p><ul><li>triggerName:触发器 ID,该 ID 是全局唯一的,用于区分不同触发器,大小写敏感。</li><li>triggerType:触发器类型,分为无状态(STATELESS)和有状态(STATEFUL)两类。</li><li>triggerEventClause:触发时机,目前仅支持写入前(BEFORE INSERT)和写入后(AFTER INSERT)两种。</li><li>pathPattern:触发器侦听的路径模式,可以包含通配符 * 和 **。</li><li>className:触发器实现类的类名。</li><li>uriClause:可选项,当不指定该选项时,我们默认 DBA 已经在各个 DataNode 节点的 trigger_root_dir 目录(配置项,默认为 IOTDB_HOME/ext/trigger)下放置好创建该触发器需要的 JAR 包。当指定该选项时,我们会将该 URI 对应的文件资源下载并分发到各 DataNode 的 trigger_root_dir/install 目录下。</li><li>triggerAttributeClause:用于指定触发器实例创建时需要设置的参数,SQL 语法中该部分是可选项。</li></ul><p>下面是一个帮助您理解的 SQL 语句示例:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> STATELESS <span class="token keyword">TRIGGER</span> triggerTest |
| BEFORE <span class="token keyword">INSERT</span> |
| <span class="token keyword">ON</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">.</span><span class="token operator">*</span><span class="token operator">*</span> |
| <span class="token keyword">AS</span> <span class="token string">'org.apache.iotdb.trigger.ClusterAlertingExample'</span> |
| <span class="token keyword">USING</span> URI <span class="token string">'http://jar/ClusterAlertingExample.jar'</span> |
| <span class="token keyword">WITH</span> <span class="token punctuation">(</span> |
| <span class="token string">"name"</span> <span class="token operator">=</span> <span class="token string">"trigger"</span><span class="token punctuation">,</span> |
| <span class="token string">"limit"</span> <span class="token operator">=</span> <span class="token string">"100"</span> |
| <span class="token punctuation">)</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>上述 SQL 语句创建了一个名为 triggerTest 的触发器:</p><ul><li>该触发器是无状态的(STATELESS)</li><li>在写入前触发(BEFORE INSERT)</li><li>该触发器侦听路径模式为 <a href="http://root.sg" target="_blank" rel="noopener noreferrer">root.sg<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a>.**</li><li>所编写的触发器类名为 org.apache.iotdb.trigger.ClusterAlertingExample</li><li>JAR 包的 URI 为 <a href="http://jar/ClusterAlertingExample.jar" target="_blank" rel="noopener noreferrer">http://jar/ClusterAlertingExample.jar<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a></li><li>创建该触发器实例时会传入 name 和 limit 两个参数。</li></ul><h4 id="卸载触发器" tabindex="-1"><a class="header-anchor" href="#卸载触发器" aria-hidden="true">#</a> 卸载触发器</h4><p>可以通过指定触发器 ID 的方式卸载触发器,卸载触发器的过程中会且仅会调用一次触发器的 <code>onDrop</code> 接口。</p><p>卸载触发器的 SQL 语法如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token comment">// Drop Trigger</span> |
| dropTrigger |
| : <span class="token keyword">DROP</span> <span class="token keyword">TRIGGER</span> triggerName<span class="token operator">=</span>identifier |
| <span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>下面是示例语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">DROP</span> <span class="token keyword">TRIGGER</span> triggerTest1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>上述语句将会卸载 ID 为 triggerTest1 的触发器。</p><h4 id="查询触发器" tabindex="-1"><a class="header-anchor" href="#查询触发器" aria-hidden="true">#</a> 查询触发器</h4><p>可以通过 SQL 语句查询集群中存在的触发器的信息。SQL 语法如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">SHOW</span> TRIGGERS |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>该语句的结果集格式如下:</p><table><thead><tr><th>TriggerName</th><th>Event</th><th>Type</th><th>State</th><th>PathPattern</th><th>ClassName</th><th>NodeId</th></tr></thead><tbody><tr><td>triggerTest1</td><td>BEFORE_INSERT / AFTER_INSERT</td><td>STATELESS / STATEFUL</td><td>INACTIVE / ACTIVE / DROPPING / TRANSFFERING</td><td>root.**</td><td>org.apache.iotdb.trigger.TriggerExample</td><td>ALL(STATELESS) / DATA_NODE_ID(STATEFUL)</td></tr></tbody></table><h4 id="触发器状态说明" tabindex="-1"><a class="header-anchor" href="#触发器状态说明" aria-hidden="true">#</a> 触发器状态说明</h4><p>在集群中注册以及卸载触发器的过程中,我们维护了触发器的状态,下面是对这些状态的说明:</p><table><thead><tr><th>状态</th><th>描述</th><th>是否建议写入进行</th></tr></thead><tbody><tr><td>INACTIVE</td><td>执行 <code>CREATE TRIGGER</code> 的中间状态,集群刚在 ConfigNode 上记录该触发器的信息,还未在任何 DataNode 上激活该触发器</td><td>否</td></tr><tr><td>ACTIVE</td><td>执行 <code>CREATE TRIGGE</code> 成功后的状态,集群所有 DataNode 上的该触发器都已经可用</td><td>是</td></tr><tr><td>DROPPING</td><td>执行 <code>DROP TRIGGER</code> 的中间状态,集群正处在卸载该触发器的过程中</td><td>否</td></tr><tr><td>TRANSFERRING</td><td>集群正在进行该触发器实例位置的迁移</td><td>否</td></tr></tbody></table><h3 id="重要注意事项" tabindex="-1"><a class="header-anchor" href="#重要注意事项" aria-hidden="true">#</a> 重要注意事项</h3><ul><li>触发器从注册时开始生效,不对已有的历史数据进行处理。<strong>即只有成功注册触发器之后发生的写入请求才会被触发器侦听到。</strong></li><li>触发器目前采用<strong>同步触发</strong>,所以编写时需要保证触发器效率,否则可能会大幅影响写入性能。<strong>您需要自己保证触发器内部的并发安全性</strong>。</li><li>集群中<strong>不能注册过多触发器</strong>。因为触发器信息全量保存在 ConfigNode 中,并且在所有 DataNode 都有一份该信息的副本。</li><li><strong>建议注册触发器时停止写入</strong>。注册触发器并不是一个原子操作,注册触发器时,会出现集群内部分节点已经注册了该触发器,部分节点尚未注册成功的中间状态。为了避免部分节点上的写入请求被触发器侦听到,部分节点上没有被侦听到的情况,我们建议注册触发器时不要执行写入。</li><li>触发器将作为进程内程序执行,如果您的触发器编写不慎,内存占用过多,由于 IoTDB 并没有办法监控触发器所使用的内存,所以有 OOM 的风险。</li><li>持有有状态触发器实例的节点宕机时,我们会尝试在另外的节点上恢复相应实例,在恢复过程中我们会调用一次触发器类的 restore 接口,您可以在该接口中实现恢复触发器所维护的状态的逻辑。</li><li>触发器 JAR 包有大小限制,必须小于 min(<code>config_node_ratis_log_appender_buffer_size_max</code>, 2G),其中 <code>config_node_ratis_log_appender_buffer_size_max</code> 是一个配置项,具体含义可以参考 IOTDB 配置项说明。</li><li><strong>不同的 JAR 包中最好不要有全类名相同但功能实现不一样的类</strong>。例如:触发器 trigger1、trigger2 分别对应资源 trigger1.jar、trigger2.jar。如果两个 JAR 包里都包含一个 <code>org.apache.iotdb.trigger.example.AlertListener</code> 类,当 <code>CREATE TRIGGER</code> 使用到这个类时,系统会随机加载其中一个 JAR 包中的类,最终导致触发器执行行为不一致以及其他的问题。</li></ul><h3 id="配置参数" tabindex="-1"><a class="header-anchor" href="#配置参数" aria-hidden="true">#</a> 配置参数</h3><table><thead><tr><th>配置项</th><th>含义</th></tr></thead><tbody><tr><td><em>trigger_lib_dir</em></td><td>保存触发器 jar 包的目录位置</td></tr><tr><td><em>stateful_trigger_retry_num_when_not_found</em></td><td>有状态触发器触发无法找到触发器实例时的重试次数</td></tr></tbody></table><h2 id="连续查询-continuous-query-cq" tabindex="-1"><a class="header-anchor" href="#连续查询-continuous-query-cq" aria-hidden="true">#</a> 连续查询(Continuous Query, CQ)</h2><h3 id="简介" tabindex="-1"><a class="header-anchor" href="#简介" aria-hidden="true">#</a> 简介</h3><p>连续查询(Continuous queries, aka CQ) 是对实时数据周期性地自动执行的查询,并将查询结果写入指定的时间序列中。</p><h3 id="语法" tabindex="-1"><a class="header-anchor" href="#语法" aria-hidden="true">#</a> 语法</h3><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> <span class="token punctuation">(</span>CONTINUOUS QUERY <span class="token operator">|</span> CQ<span class="token punctuation">)</span> <span class="token operator"><</span>cq_id<span class="token operator">></span> |
| <span class="token punctuation">[</span>RESAMPLE |
| <span class="token punctuation">[</span>EVERY <span class="token operator"><</span>every_interval<span class="token operator">></span><span class="token punctuation">]</span> |
| <span class="token punctuation">[</span>BOUNDARY <span class="token operator"><</span>execution_boundary_time<span class="token operator">></span><span class="token punctuation">]</span> |
| <span class="token punctuation">[</span>RANGE <span class="token operator"><</span>start_time_offset<span class="token operator">></span><span class="token punctuation">[</span><span class="token punctuation">,</span> end_time_offset<span class="token punctuation">]</span><span class="token punctuation">]</span> |
| <span class="token punctuation">]</span> |
| <span class="token punctuation">[</span>TIMEOUT POLICY BLOCKED<span class="token operator">|</span><span class="token keyword">DISCARD</span><span class="token punctuation">]</span> |
| <span class="token keyword">BEGIN</span> |
| <span class="token keyword">SELECT</span> CLAUSE |
| <span class="token keyword">INTO</span> CLAUSE |
| <span class="token keyword">FROM</span> CLAUSE |
| <span class="token punctuation">[</span><span class="token keyword">WHERE</span> CLAUSE<span class="token punctuation">]</span> |
| <span class="token punctuation">[</span><span class="token keyword">GROUP</span> <span class="token keyword">BY</span><span class="token punctuation">(</span><span class="token operator"><</span>group_by_interval<span class="token operator">></span><span class="token punctuation">[</span><span class="token punctuation">,</span> <span class="token operator"><</span>sliding_step<span class="token operator">></span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">[</span><span class="token punctuation">,</span> <span class="token keyword">level</span> <span class="token operator">=</span> <span class="token operator"><</span><span class="token keyword">level</span><span class="token operator">></span><span class="token punctuation">]</span><span class="token punctuation">]</span> |
| <span class="token punctuation">[</span><span class="token keyword">HAVING</span> CLAUSE<span class="token punctuation">]</span> |
| <span class="token punctuation">[</span>FILL {PREVIOUS <span class="token operator">|</span> LINEAR <span class="token operator">|</span> constant}<span class="token punctuation">]</span> |
| <span class="token punctuation">[</span><span class="token keyword">LIMIT</span> rowLimit <span class="token keyword">OFFSET</span> rowOffset<span class="token punctuation">]</span> |
| <span class="token punctuation">[</span>ALIGN <span class="token keyword">BY</span> DEVICE<span class="token punctuation">]</span> |
| <span class="token keyword">END</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><blockquote><p>注意:</p><ol><li>如果where子句中出现任何时间过滤条件,IoTDB将会抛出异常,因为IoTDB会自动为每次查询执行指定时间范围。</li><li>GROUP BY TIME CLAUSE在连续查询中的语法稍有不同,它不能包含原来的第一个参数,即 [start_time, end_time),IoTDB会自动填充这个缺失的参数。如果指定,IoTDB将会抛出异常。</li><li>如果连续查询中既没有GROUP BY TIME子句,也没有指定EVERY子句,IoTDB将会抛出异常。</li></ol></blockquote><h4 id="连续查询语法中参数含义的描述" tabindex="-1"><a class="header-anchor" href="#连续查询语法中参数含义的描述" aria-hidden="true">#</a> 连续查询语法中参数含义的描述</h4><ul><li><code><cq_id></code> 为连续查询指定一个全局唯一的标识。</li><li><code><every_interval></code> 指定了连续查询周期性执行的间隔。现在支持的时间单位有:ns, us, ms, s, m, h, d, w, 并且它的值不能小于用户在<code>iotdb-confignode.properties</code>配置文件中指定的<code>continuous_query_min_every_interval</code>。这是一个可选参数,默认等于group by子句中的<code>group_by_interval</code>。</li><li><code><start_time_offset></code> 指定了每次查询执行窗口的开始时间,即<code>now()-<start_time_offset></code>。现在支持的时间单位有:ns, us, ms, s, m, h, d, w。这是一个可选参数,默认等于<code>EVERY</code>子句中的<code>every_interval</code>。</li><li><code><end_time_offset></code> 指定了每次查询执行窗口的结束时间,即<code>now()-<end_time_offset></code>。现在支持的时间单位有:ns, us, ms, s, m, h, d, w。这是一个可选参数,默认等于<code>0</code>.</li><li><code><execution_boundary_time></code> 表示用户期待的连续查询的首个周期任务的执行时间。(因为连续查询只会对当前实时的数据流做计算,所以该连续查询实际首个周期任务的执行时间并不一定等于用户指定的时间,具体计算逻辑如下所示) <ul><li><code><execution_boundary_time></code> 可以早于、等于或者迟于当前时间。</li><li>这个参数是可选的,默认等于<code>0</code>。</li><li>首次查询执行窗口的开始时间为<code><execution_boundary_time> - <start_time_offset></code>.</li><li>首次查询执行窗口的结束时间为<code><execution_boundary_time> - <end_time_offset></code>.</li><li>第i个查询执行窗口的时间范围是<code>[<execution_boundary_time> - <start_time_offset> + (i - 1) * <every_interval>, <execution_boundary_time> - <end_time_offset> + (i - 1) * <every_interval>)</code>。</li><li>如果当前时间早于或等于, 那连续查询的首个周期任务的执行时间就是用户指定的<code>execution_boundary_time</code>.</li><li>如果当前时间迟于用户指定的<code>execution_boundary_time</code>,那么连续查询的首个周期任务的执行时间就是<code>execution_boundary_time + i * <every_interval></code>中第一个大于或等于当前时间的值。</li></ul></li></ul><blockquote><ul><li><every_interval>,<start_time_offset> 和 <group_by_interval> 都应该大于 0</li><li><group_by_interval>应该小于等于<start_time_offset></li><li>用户应该根据实际需求,为<start_time_offset> 和 <every_interval> 指定合适的值 <ul><li>如果<start_time_offset>大于<every_interval>,在每一次查询执行的时间窗口上会有部分重叠</li><li>如果<start_time_offset>小于<every_interval>,在连续的两次查询执行的时间窗口中间将会有未覆盖的时间范围</li></ul></li><li>start_time_offset 应该大于end_time_offset</li></ul></blockquote><h5 id="start-time-offset-等于-every-interval" tabindex="-1"><a class="header-anchor" href="#start-time-offset-等于-every-interval" aria-hidden="true">#</a> <code><start_time_offset></code>等于<code><every_interval></code></h5><figure><img src="https://alioss.timecho.com/docs/img/UserGuide/Process-Data/Continuous-Query/pic1.png?raw=true" alt="1" tabindex="0" loading="lazy"><figcaption>1</figcaption></figure><h5 id="start-time-offset-大于-every-interval" tabindex="-1"><a class="header-anchor" href="#start-time-offset-大于-every-interval" aria-hidden="true">#</a> <code><start_time_offset></code>大于<code><every_interval></code></h5><figure><img src="https://alioss.timecho.com/docs/img/UserGuide/Process-Data/Continuous-Query/pic2.png?raw=true" alt="2" tabindex="0" loading="lazy"><figcaption>2</figcaption></figure><h5 id="start-time-offset-小于-every-interval" tabindex="-1"><a class="header-anchor" href="#start-time-offset-小于-every-interval" aria-hidden="true">#</a> <code><start_time_offset></code>小于<code><every_interval></code></h5><figure><img src="https://alioss.timecho.com/docs/img/UserGuide/Process-Data/Continuous-Query/pic3.png?raw=true" alt="3" tabindex="0" loading="lazy"><figcaption>3</figcaption></figure><h5 id="every-interval-不为0" tabindex="-1"><a class="header-anchor" href="#every-interval-不为0" aria-hidden="true">#</a> <code><every_interval></code>不为0</h5><figure><img src="https://alioss.timecho.com/docs/img/UserGuide/Process-Data/Continuous-Query/pic4.png?raw=true" alt="4" tabindex="0" loading="lazy"><figcaption>4</figcaption></figure><ul><li><code>TIMEOUT POLICY</code> 指定了我们如何处理“前一个时间窗口还未执行完时,下一个窗口的执行时间已经到达的场景,默认值是<code>BLOCKED</code>. <ul><li><code>BLOCKED</code>意味着即使下一个窗口的执行时间已经到达,我们依旧需要阻塞等待前一个时间窗口的查询执行完再开始执行下一个窗口。如果使用<code>BLOCKED</code>策略,所有的时间窗口都将会被依此执行,但是如果遇到执行查询的时间长于周期性间隔时,连续查询的结果会迟于最新的时间窗口范围。</li><li><code>DISCARD</code>意味着如果前一个时间窗口还未执行完,我们会直接丢弃下一个窗口的执行时间。如果使用<code>DISCARD</code>策略,可能会有部分时间窗口得不到执行。但是一旦前一个查询执行完后,它将会使用最新的时间窗口,所以它的执行结果总能赶上最新的时间窗口范围,当然是以部分时间窗口得不到执行为代价。</li></ul></li></ul><h3 id="连续查询的用例" tabindex="-1"><a class="header-anchor" href="#连续查询的用例" aria-hidden="true">#</a> 连续查询的用例</h3><p>下面是用例数据,这是一个实时的数据流,我们假设数据都按时到达。</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+ |
| | Time|root.ln.wf02.wt02.temperature|root.ln.wf02.wt01.temperature|root.ln.wf01.wt02.temperature|root.ln.wf01.wt01.temperature| |
| +-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+ |
| |2021-05-11T22:18:14.598+08:00| 121.0| 72.0| 183.0| 115.0| |
| |2021-05-11T22:18:19.941+08:00| 0.0| 68.0| 68.0| 103.0| |
| |2021-05-11T22:18:24.949+08:00| 122.0| 45.0| 11.0| 14.0| |
| |2021-05-11T22:18:29.967+08:00| 47.0| 14.0| 59.0| 181.0| |
| |2021-05-11T22:18:34.979+08:00| 182.0| 113.0| 29.0| 180.0| |
| |2021-05-11T22:18:39.990+08:00| 42.0| 11.0| 52.0| 19.0| |
| |2021-05-11T22:18:44.995+08:00| 78.0| 38.0| 123.0| 52.0| |
| |2021-05-11T22:18:49.999+08:00| 137.0| 172.0| 135.0| 193.0| |
| |2021-05-11T22:18:55.003+08:00| 16.0| 124.0| 183.0| 18.0| |
| +-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="配置连续查询执行的周期性间隔" tabindex="-1"><a class="header-anchor" href="#配置连续查询执行的周期性间隔" aria-hidden="true">#</a> 配置连续查询执行的周期性间隔</h4><p>在<code>RESAMPLE</code>子句中使用<code>EVERY</code>参数指定连续查询的执行间隔,如果没有指定,默认等于<code>group_by_interval</code>。</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> CONTINUOUS QUERY cq1 |
| RESAMPLE EVERY <span class="token number">20</span>s |
| <span class="token keyword">BEGIN</span> |
| <span class="token keyword">SELECT</span> max_value<span class="token punctuation">(</span>temperature<span class="token punctuation">)</span> |
| <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf02<span class="token punctuation">.</span>wt02<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf02<span class="token punctuation">.</span>wt01<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf01<span class="token punctuation">.</span>wt02<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf01<span class="token punctuation">.</span>wt01<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span> |
| <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span><span class="token operator">*</span><span class="token punctuation">.</span><span class="token operator">*</span> |
| <span class="token keyword">GROUP</span> <span class="token keyword">BY</span><span class="token punctuation">(</span><span class="token number">10</span>s<span class="token punctuation">)</span> |
| <span class="token keyword">END</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>cq1</code>计算出<code>temperature</code>传感器每10秒的平均值,并且将查询结果存储在<code>temperature_max</code>传感器下,传感器路径前缀使用跟原来一样的前缀。</p><p><code>cq1</code>每20秒执行一次,每次执行的查询的时间窗口范围是从过去20秒到当前时间。</p><p>假设当前时间是<code>2021-05-11T22:18:40.000+08:00</code>,如果把日志等级设置为DEBUG,我们可以在<code>cq1</code>执行的DataNode上看到如下的输出:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>At **2021-05-11T22:18:40.000+08:00**, `cq1` executes a query within the time range `[2021-05-11T22:18:20, 2021-05-11T22:18:40)`. |
| `cq1` generate 2 lines: |
| > |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:20.000+08:00| 122.0| 45.0| 59.0| 181.0| |
| |2021-05-11T22:18:30.000+08:00| 182.0| 113.0| 52.0| 180.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| > |
| At **2021-05-11T22:19:00.000+08:00**, `cq1` executes a query within the time range `[2021-05-11T22:18:40, 2021-05-11T22:19:00)`. |
| `cq1` generate 2 lines: |
| > |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:40.000+08:00| 137.0| 172.0| 135.0| 193.0| |
| |2021-05-11T22:18:50.000+08:00| 16.0| 124.0| 183.0| 18.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| > |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>cq1</code>并不会处理当前时间窗口以外的数据,即<code>2021-05-11T22:18:20.000+08:00</code>以前的数据,所以我们会得到如下结果:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>> SELECT temperature_max from root.ln.*.*; |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:20.000+08:00| 122.0| 45.0| 59.0| 181.0| |
| |2021-05-11T22:18:30.000+08:00| 182.0| 113.0| 52.0| 180.0| |
| |2021-05-11T22:18:40.000+08:00| 137.0| 172.0| 135.0| 193.0| |
| |2021-05-11T22:18:50.000+08:00| 16.0| 124.0| 183.0| 18.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="配置连续查询的时间窗口大小" tabindex="-1"><a class="header-anchor" href="#配置连续查询的时间窗口大小" aria-hidden="true">#</a> 配置连续查询的时间窗口大小</h4><p>使用<code>RANGE</code>子句中的<code>start_time_offset</code>参数指定连续查询每次执行的时间窗口的开始时间偏移,如果没有指定,默认值等于<code>EVERY</code>参数。</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> CONTINUOUS QUERY cq2 |
| RESAMPLE RANGE <span class="token number">40</span>s |
| <span class="token keyword">BEGIN</span> |
| <span class="token keyword">SELECT</span> max_value<span class="token punctuation">(</span>temperature<span class="token punctuation">)</span> |
| <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf02<span class="token punctuation">.</span>wt02<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf02<span class="token punctuation">.</span>wt01<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf01<span class="token punctuation">.</span>wt02<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf01<span class="token punctuation">.</span>wt01<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span> |
| <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span><span class="token operator">*</span><span class="token punctuation">.</span><span class="token operator">*</span> |
| <span class="token keyword">GROUP</span> <span class="token keyword">BY</span><span class="token punctuation">(</span><span class="token number">10</span>s<span class="token punctuation">)</span> |
| <span class="token keyword">END</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>cq2</code>计算出<code>temperature</code>传感器每10秒的平均值,并且将查询结果存储在<code>temperature_max</code>传感器下,传感器路径前缀使用跟原来一样的前缀。</p><p><code>cq2</code>每10秒执行一次,每次执行的查询的时间窗口范围是从过去40秒到当前时间。</p><p>假设当前时间是<code>2021-05-11T22:18:40.000+08:00</code>,如果把日志等级设置为DEBUG,我们可以在<code>cq2</code>执行的DataNode上看到如下的输出:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>At **2021-05-11T22:18:40.000+08:00**, `cq2` executes a query within the time range `[2021-05-11T22:18:00, 2021-05-11T22:18:40)`. |
| `cq2` generate 4 lines: |
| > |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:00.000+08:00| NULL| NULL| NULL| NULL| |
| |2021-05-11T22:18:10.000+08:00| 121.0| 72.0| 183.0| 115.0| |
| |2021-05-11T22:18:20.000+08:00| 122.0| 45.0| 59.0| 181.0| |
| |2021-05-11T22:18:30.000+08:00| 182.0| 113.0| 52.0| 180.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| > |
| At **2021-05-11T22:18:50.000+08:00**, `cq2` executes a query within the time range `[2021-05-11T22:18:10, 2021-05-11T22:18:50)`. |
| `cq2` generate 4 lines: |
| > |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:10.000+08:00| 121.0| 72.0| 183.0| 115.0| |
| |2021-05-11T22:18:20.000+08:00| 122.0| 45.0| 59.0| 181.0| |
| |2021-05-11T22:18:30.000+08:00| 182.0| 113.0| 52.0| 180.0| |
| |2021-05-11T22:18:40.000+08:00| 137.0| 172.0| 135.0| 193.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| > |
| At **2021-05-11T22:19:00.000+08:00**, `cq2` executes a query within the time range `[2021-05-11T22:18:20, 2021-05-11T22:19:00)`. |
| `cq2` generate 4 lines: |
| > |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:20.000+08:00| 122.0| 45.0| 59.0| 181.0| |
| |2021-05-11T22:18:30.000+08:00| 182.0| 113.0| 52.0| 180.0| |
| |2021-05-11T22:18:40.000+08:00| 137.0| 172.0| 135.0| 193.0| |
| |2021-05-11T22:18:50.000+08:00| 16.0| 124.0| 183.0| 18.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| > |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>cq2</code>并不会写入全是null值的行,值得注意的是<code>cq2</code>会多次计算某些区间的聚合值,下面是计算结果:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>> SELECT temperature_max from root.ln.*.*; |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:10.000+08:00| 121.0| 72.0| 183.0| 115.0| |
| |2021-05-11T22:18:20.000+08:00| 122.0| 45.0| 59.0| 181.0| |
| |2021-05-11T22:18:30.000+08:00| 182.0| 113.0| 52.0| 180.0| |
| |2021-05-11T22:18:40.000+08:00| 137.0| 172.0| 135.0| 193.0| |
| |2021-05-11T22:18:50.000+08:00| 16.0| 124.0| 183.0| 18.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="同时配置连续查询执行的周期性间隔和时间窗口大小" tabindex="-1"><a class="header-anchor" href="#同时配置连续查询执行的周期性间隔和时间窗口大小" aria-hidden="true">#</a> 同时配置连续查询执行的周期性间隔和时间窗口大小</h4><p>使用<code>RESAMPLE</code>子句中的<code>EVERY</code>参数和<code>RANGE</code>参数分别指定连续查询的执行间隔和窗口大小。并且使用<code>fill()</code>来填充没有值的时间区间。</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> CONTINUOUS QUERY cq3 |
| RESAMPLE EVERY <span class="token number">20</span>s RANGE <span class="token number">40</span>s |
| <span class="token keyword">BEGIN</span> |
| <span class="token keyword">SELECT</span> max_value<span class="token punctuation">(</span>temperature<span class="token punctuation">)</span> |
| <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf02<span class="token punctuation">.</span>wt02<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf02<span class="token punctuation">.</span>wt01<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf01<span class="token punctuation">.</span>wt02<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf01<span class="token punctuation">.</span>wt01<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span> |
| <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span><span class="token operator">*</span><span class="token punctuation">.</span><span class="token operator">*</span> |
| <span class="token keyword">GROUP</span> <span class="token keyword">BY</span><span class="token punctuation">(</span><span class="token number">10</span>s<span class="token punctuation">)</span> |
| FILL<span class="token punctuation">(</span><span class="token number">100.0</span><span class="token punctuation">)</span> |
| <span class="token keyword">END</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>cq3</code>计算出<code>temperature</code>传感器每10秒的平均值,并且将查询结果存储在<code>temperature_max</code>传感器下,传感器路径前缀使用跟原来一样的前缀。如果某些区间没有值,用<code>100.0</code>填充。</p><p><code>cq3</code>每20秒执行一次,每次执行的查询的时间窗口范围是从过去40秒到当前时间。</p><p>假设当前时间是<code>2021-05-11T22:18:40.000+08:00</code>,如果把日志等级设置为DEBUG,我们可以在<code>cq3</code>执行的DataNode上看到如下的输出:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>At **2021-05-11T22:18:40.000+08:00**, `cq3` executes a query within the time range `[2021-05-11T22:18:00, 2021-05-11T22:18:40)`. |
| `cq3` generate 4 lines: |
| > |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:00.000+08:00| 100.0| 100.0| 100.0| 100.0| |
| |2021-05-11T22:18:10.000+08:00| 121.0| 72.0| 183.0| 115.0| |
| |2021-05-11T22:18:20.000+08:00| 122.0| 45.0| 59.0| 181.0| |
| |2021-05-11T22:18:30.000+08:00| 182.0| 113.0| 52.0| 180.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| > |
| At **2021-05-11T22:19:00.000+08:00**, `cq3` executes a query within the time range `[2021-05-11T22:18:20, 2021-05-11T22:19:00)`. |
| `cq3` generate 4 lines: |
| > |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:20.000+08:00| 122.0| 45.0| 59.0| 181.0| |
| |2021-05-11T22:18:30.000+08:00| 182.0| 113.0| 52.0| 180.0| |
| |2021-05-11T22:18:40.000+08:00| 137.0| 172.0| 135.0| 193.0| |
| |2021-05-11T22:18:50.000+08:00| 16.0| 124.0| 183.0| 18.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| > |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>值得注意的是<code>cq3</code>会多次计算某些区间的聚合值,下面是计算结果:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>> SELECT temperature_max from root.ln.*.*; |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:00.000+08:00| 100.0| 100.0| 100.0| 100.0| |
| |2021-05-11T22:18:10.000+08:00| 121.0| 72.0| 183.0| 115.0| |
| |2021-05-11T22:18:20.000+08:00| 122.0| 45.0| 59.0| 181.0| |
| |2021-05-11T22:18:30.000+08:00| 182.0| 113.0| 52.0| 180.0| |
| |2021-05-11T22:18:40.000+08:00| 137.0| 172.0| 135.0| 193.0| |
| |2021-05-11T22:18:50.000+08:00| 16.0| 124.0| 183.0| 18.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="配置连续查询每次查询执行时间窗口的结束时间" tabindex="-1"><a class="header-anchor" href="#配置连续查询每次查询执行时间窗口的结束时间" aria-hidden="true">#</a> 配置连续查询每次查询执行时间窗口的结束时间</h4><p>使用<code>RESAMPLE</code>子句中的<code>EVERY</code>参数和<code>RANGE</code>参数分别指定连续查询的执行间隔和窗口大小。并且使用<code>fill()</code>来填充没有值的时间区间。</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> CONTINUOUS QUERY cq4 |
| RESAMPLE EVERY <span class="token number">20</span>s RANGE <span class="token number">40</span>s<span class="token punctuation">,</span> <span class="token number">20</span>s |
| <span class="token keyword">BEGIN</span> |
| <span class="token keyword">SELECT</span> max_value<span class="token punctuation">(</span>temperature<span class="token punctuation">)</span> |
| <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf02<span class="token punctuation">.</span>wt02<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf02<span class="token punctuation">.</span>wt01<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf01<span class="token punctuation">.</span>wt02<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span><span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf01<span class="token punctuation">.</span>wt01<span class="token punctuation">(</span>temperature_max<span class="token punctuation">)</span> |
| <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span><span class="token operator">*</span><span class="token punctuation">.</span><span class="token operator">*</span> |
| <span class="token keyword">GROUP</span> <span class="token keyword">BY</span><span class="token punctuation">(</span><span class="token number">10</span>s<span class="token punctuation">)</span> |
| FILL<span class="token punctuation">(</span><span class="token number">100.0</span><span class="token punctuation">)</span> |
| <span class="token keyword">END</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>cq4</code>计算出<code>temperature</code>传感器每10秒的平均值,并且将查询结果存储在<code>temperature_max</code>传感器下,传感器路径前缀使用跟原来一样的前缀。如果某些区间没有值,用<code>100.0</code>填充。</p><p><code>cq4</code>每20秒执行一次,每次执行的查询的时间窗口范围是从过去40秒到过去20秒。</p><p>假设当前时间是<code>2021-05-11T22:18:40.000+08:00</code>,如果把日志等级设置为DEBUG,我们可以在<code>cq4</code>执行的DataNode上看到如下的输出:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>At **2021-05-11T22:18:40.000+08:00**, `cq4` executes a query within the time range `[2021-05-11T22:18:00, 2021-05-11T22:18:20)`. |
| `cq4` generate 2 lines: |
| > |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:00.000+08:00| 100.0| 100.0| 100.0| 100.0| |
| |2021-05-11T22:18:10.000+08:00| 121.0| 72.0| 183.0| 115.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| > |
| At **2021-05-11T22:19:00.000+08:00**, `cq4` executes a query within the time range `[2021-05-11T22:18:20, 2021-05-11T22:18:40)`. |
| `cq4` generate 2 lines: |
| > |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:20.000+08:00| 122.0| 45.0| 59.0| 181.0| |
| |2021-05-11T22:18:30.000+08:00| 182.0| 113.0| 52.0| 180.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| > |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>值得注意的是<code>cq4</code>只会计算每个聚合区间一次,并且每次开始执行计算的时间都会比当前的时间窗口结束时间迟20s, 下面是计算结果:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>> SELECT temperature_max from root.ln.*.*; |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| | Time|root.ln.wf02.wt02.temperature_max|root.ln.wf02.wt01.temperature_max|root.ln.wf01.wt02.temperature_max|root.ln.wf01.wt01.temperature_max| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| |2021-05-11T22:18:00.000+08:00| 100.0| 100.0| 100.0| 100.0| |
| |2021-05-11T22:18:10.000+08:00| 121.0| 72.0| 183.0| 115.0| |
| |2021-05-11T22:18:20.000+08:00| 122.0| 45.0| 59.0| 181.0| |
| |2021-05-11T22:18:30.000+08:00| 182.0| 113.0| 52.0| 180.0| |
| +-----------------------------+---------------------------------+---------------------------------+---------------------------------+---------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="没有group-by-time子句的连续查询" tabindex="-1"><a class="header-anchor" href="#没有group-by-time子句的连续查询" aria-hidden="true">#</a> 没有GROUP BY TIME子句的连续查询</h4><p>不使用<code>GROUP BY TIME</code>子句,并在<code>RESAMPLE</code>子句中显式使用<code>EVERY</code>参数指定连续查询的执行间隔。</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> CONTINUOUS QUERY cq5 |
| RESAMPLE EVERY <span class="token number">20</span>s |
| <span class="token keyword">BEGIN</span> |
| <span class="token keyword">SELECT</span> temperature <span class="token operator">+</span> <span class="token number">1</span> |
| <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>precalculated_sg<span class="token punctuation">.</span>::<span class="token punctuation">(</span>temperature<span class="token punctuation">)</span> |
| <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span><span class="token operator">*</span><span class="token punctuation">.</span><span class="token operator">*</span> |
| align <span class="token keyword">by</span> device |
| <span class="token keyword">END</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>cq5</code>计算以<code>root.ln</code>为前缀的所有<code>temperature + 1</code>的值,并将结果储存在另一个 database <code>root.precalculated_sg</code>中。除 database 名称不同外,目标序列与源序列路径名均相同。</p><p><code>cq5</code>每20秒执行一次,每次执行的查询的时间窗口范围是从过去20秒到当前时间。</p><p>假设当前时间是<code>2021-05-11T22:18:40.000+08:00</code>,如果把日志等级设置为DEBUG,我们可以在<code>cq5</code>执行的DataNode上看到如下的输出:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>At **2021-05-11T22:18:40.000+08:00**, `cq5` executes a query within the time range `[2021-05-11T22:18:20, 2021-05-11T22:18:40)`. |
| `cq5` generate 16 lines: |
| > |
| +-----------------------------+-------------------------------+-----------+ |
| | Time| Device|temperature| |
| +-----------------------------+-------------------------------+-----------+ |
| |2021-05-11T22:18:24.949+08:00|root.precalculated_sg.wf02.wt02| 123.0| |
| |2021-05-11T22:18:29.967+08:00|root.precalculated_sg.wf02.wt02| 48.0| |
| |2021-05-11T22:18:34.979+08:00|root.precalculated_sg.wf02.wt02| 183.0| |
| |2021-05-11T22:18:39.990+08:00|root.precalculated_sg.wf02.wt02| 45.0| |
| |2021-05-11T22:18:24.949+08:00|root.precalculated_sg.wf02.wt01| 46.0| |
| |2021-05-11T22:18:29.967+08:00|root.precalculated_sg.wf02.wt01| 15.0| |
| |2021-05-11T22:18:34.979+08:00|root.precalculated_sg.wf02.wt01| 114.0| |
| |2021-05-11T22:18:39.990+08:00|root.precalculated_sg.wf02.wt01| 12.0| |
| |2021-05-11T22:18:24.949+08:00|root.precalculated_sg.wf01.wt02| 12.0| |
| |2021-05-11T22:18:29.967+08:00|root.precalculated_sg.wf01.wt02| 60.0| |
| |2021-05-11T22:18:34.979+08:00|root.precalculated_sg.wf01.wt02| 30.0| |
| |2021-05-11T22:18:39.990+08:00|root.precalculated_sg.wf01.wt02| 53.0| |
| |2021-05-11T22:18:24.949+08:00|root.precalculated_sg.wf01.wt01| 15.0| |
| |2021-05-11T22:18:29.967+08:00|root.precalculated_sg.wf01.wt01| 182.0| |
| |2021-05-11T22:18:34.979+08:00|root.precalculated_sg.wf01.wt01| 181.0| |
| |2021-05-11T22:18:39.990+08:00|root.precalculated_sg.wf01.wt01| 20.0| |
| +-----------------------------+-------------------------------+-----------+ |
| > |
| At **2021-05-11T22:19:00.000+08:00**, `cq5` executes a query within the time range `[2021-05-11T22:18:40, 2021-05-11T22:19:00)`. |
| `cq5` generate 12 lines: |
| > |
| +-----------------------------+-------------------------------+-----------+ |
| | Time| Device|temperature| |
| +-----------------------------+-------------------------------+-----------+ |
| |2021-05-11T22:18:44.995+08:00|root.precalculated_sg.wf02.wt02| 79.0| |
| |2021-05-11T22:18:49.999+08:00|root.precalculated_sg.wf02.wt02| 138.0| |
| |2021-05-11T22:18:55.003+08:00|root.precalculated_sg.wf02.wt02| 17.0| |
| |2021-05-11T22:18:44.995+08:00|root.precalculated_sg.wf02.wt01| 39.0| |
| |2021-05-11T22:18:49.999+08:00|root.precalculated_sg.wf02.wt01| 173.0| |
| |2021-05-11T22:18:55.003+08:00|root.precalculated_sg.wf02.wt01| 125.0| |
| |2021-05-11T22:18:44.995+08:00|root.precalculated_sg.wf01.wt02| 124.0| |
| |2021-05-11T22:18:49.999+08:00|root.precalculated_sg.wf01.wt02| 136.0| |
| |2021-05-11T22:18:55.003+08:00|root.precalculated_sg.wf01.wt02| 184.0| |
| |2021-05-11T22:18:44.995+08:00|root.precalculated_sg.wf01.wt01| 53.0| |
| |2021-05-11T22:18:49.999+08:00|root.precalculated_sg.wf01.wt01| 194.0| |
| |2021-05-11T22:18:55.003+08:00|root.precalculated_sg.wf01.wt01| 19.0| |
| +-----------------------------+-------------------------------+-----------+ |
| > |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>cq5</code>并不会处理当前时间窗口以外的数据,即<code>2021-05-11T22:18:20.000+08:00</code>以前的数据,所以我们会得到如下结果:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>> SELECT temperature from root.precalculated_sg.*.* align by device; |
| +-----------------------------+-------------------------------+-----------+ |
| | Time| Device|temperature| |
| +-----------------------------+-------------------------------+-----------+ |
| |2021-05-11T22:18:24.949+08:00|root.precalculated_sg.wf02.wt02| 123.0| |
| |2021-05-11T22:18:29.967+08:00|root.precalculated_sg.wf02.wt02| 48.0| |
| |2021-05-11T22:18:34.979+08:00|root.precalculated_sg.wf02.wt02| 183.0| |
| |2021-05-11T22:18:39.990+08:00|root.precalculated_sg.wf02.wt02| 45.0| |
| |2021-05-11T22:18:44.995+08:00|root.precalculated_sg.wf02.wt02| 79.0| |
| |2021-05-11T22:18:49.999+08:00|root.precalculated_sg.wf02.wt02| 138.0| |
| |2021-05-11T22:18:55.003+08:00|root.precalculated_sg.wf02.wt02| 17.0| |
| |2021-05-11T22:18:24.949+08:00|root.precalculated_sg.wf02.wt01| 46.0| |
| |2021-05-11T22:18:29.967+08:00|root.precalculated_sg.wf02.wt01| 15.0| |
| |2021-05-11T22:18:34.979+08:00|root.precalculated_sg.wf02.wt01| 114.0| |
| |2021-05-11T22:18:39.990+08:00|root.precalculated_sg.wf02.wt01| 12.0| |
| |2021-05-11T22:18:44.995+08:00|root.precalculated_sg.wf02.wt01| 39.0| |
| |2021-05-11T22:18:49.999+08:00|root.precalculated_sg.wf02.wt01| 173.0| |
| |2021-05-11T22:18:55.003+08:00|root.precalculated_sg.wf02.wt01| 125.0| |
| |2021-05-11T22:18:24.949+08:00|root.precalculated_sg.wf01.wt02| 12.0| |
| |2021-05-11T22:18:29.967+08:00|root.precalculated_sg.wf01.wt02| 60.0| |
| |2021-05-11T22:18:34.979+08:00|root.precalculated_sg.wf01.wt02| 30.0| |
| |2021-05-11T22:18:39.990+08:00|root.precalculated_sg.wf01.wt02| 53.0| |
| |2021-05-11T22:18:44.995+08:00|root.precalculated_sg.wf01.wt02| 124.0| |
| |2021-05-11T22:18:49.999+08:00|root.precalculated_sg.wf01.wt02| 136.0| |
| |2021-05-11T22:18:55.003+08:00|root.precalculated_sg.wf01.wt02| 184.0| |
| |2021-05-11T22:18:24.949+08:00|root.precalculated_sg.wf01.wt01| 15.0| |
| |2021-05-11T22:18:29.967+08:00|root.precalculated_sg.wf01.wt01| 182.0| |
| |2021-05-11T22:18:34.979+08:00|root.precalculated_sg.wf01.wt01| 181.0| |
| |2021-05-11T22:18:39.990+08:00|root.precalculated_sg.wf01.wt01| 20.0| |
| |2021-05-11T22:18:44.995+08:00|root.precalculated_sg.wf01.wt01| 53.0| |
| |2021-05-11T22:18:49.999+08:00|root.precalculated_sg.wf01.wt01| 194.0| |
| |2021-05-11T22:18:55.003+08:00|root.precalculated_sg.wf01.wt01| 19.0| |
| +-----------------------------+-------------------------------+-----------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="连续查询的管理" tabindex="-1"><a class="header-anchor" href="#连续查询的管理" aria-hidden="true">#</a> 连续查询的管理</h3><h4 id="查询系统已有的连续查询" tabindex="-1"><a class="header-anchor" href="#查询系统已有的连续查询" aria-hidden="true">#</a> 查询系统已有的连续查询</h4><p>展示集群中所有的已注册的连续查询</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">SHOW</span> <span class="token punctuation">(</span>CONTINUOUS QUERIES <span class="token operator">|</span> CQS<span class="token punctuation">)</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p><code>SHOW (CONTINUOUS QUERIES | CQS)</code>会将结果集按照<code>cq_id</code>排序。</p><h5 id="例子" tabindex="-1"><a class="header-anchor" href="#例子" aria-hidden="true">#</a> 例子</h5><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">SHOW</span> CONTINUOUS QUERIES<span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>执行以上sql,我们将会得到如下的查询结果:</p><table><thead><tr><th style="text-align:left;">cq_id</th><th>query</th><th>state</th></tr></thead><tbody><tr><td style="text-align:left;">s1_count_cq</td><td>CREATE CQ s1_count_cq<br>BEGIN<br>SELECT count(s1)<br>INTO root.sg_count.d.count_s1<br>FROM root.sg.d<br>GROUP BY(30m)<br>END</td><td>active</td></tr></tbody></table><h4 id="删除已有的连续查询" tabindex="-1"><a class="header-anchor" href="#删除已有的连续查询" aria-hidden="true">#</a> 删除已有的连续查询</h4><p>删除指定的名为cq_id的连续查询:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">DROP</span> <span class="token punctuation">(</span>CONTINUOUS QUERY <span class="token operator">|</span> CQ<span class="token punctuation">)</span> <span class="token operator"><</span>cq_id<span class="token operator">></span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>DROP CQ并不会返回任何结果集。</p><h5 id="例子-1" tabindex="-1"><a class="header-anchor" href="#例子-1" aria-hidden="true">#</a> 例子</h5><p>删除名为s1_count_cq的连续查询:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">DROP</span> CONTINUOUS QUERY s1_count_cq<span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h4 id="修改已有的连续查询" tabindex="-1"><a class="header-anchor" href="#修改已有的连续查询" aria-hidden="true">#</a> 修改已有的连续查询</h4><p>目前连续查询一旦被创建就不能再被修改。如果想要修改某个连续查询,只能先用<code>DROP</code>命令删除它,然后再用<code>CREATE</code>命令重新创建。</p><h3 id="连续查询的使用场景" tabindex="-1"><a class="header-anchor" href="#连续查询的使用场景" aria-hidden="true">#</a> 连续查询的使用场景</h3><h4 id="对数据进行降采样并对降采样后的数据使用不同的保留策略" tabindex="-1"><a class="header-anchor" href="#对数据进行降采样并对降采样后的数据使用不同的保留策略" aria-hidden="true">#</a> 对数据进行降采样并对降采样后的数据使用不同的保留策略</h4><p>可以使用连续查询,定期将高频率采样的原始数据(如每秒1000个点),降采样(如每秒仅保留一个点)后保存到另一个 database 的同名序列中。高精度的原始数据所在 database 的<code>TTL</code>可能设置的比较短,比如一天,而低精度的降采样后的数据所在的 database <code>TTL</code>可以设置的比较长,比如一个月,从而达到快速释放磁盘空间的目的。</p><h4 id="预计算代价昂贵的查询" tabindex="-1"><a class="header-anchor" href="#预计算代价昂贵的查询" aria-hidden="true">#</a> 预计算代价昂贵的查询</h4><p>我们可以通过连续查询对一些重复的查询进行预计算,并将查询结果保存在某些目标序列中,这样真实查询并不需要真的再次去做计算,而是直接查询目标序列的结果,从而缩短了查询的时间。</p><blockquote><p>预计算查询结果尤其对一些可视化工具渲染时序图和工作台时有很大的加速作用。</p></blockquote><h4 id="作为子查询的替代品" tabindex="-1"><a class="header-anchor" href="#作为子查询的替代品" aria-hidden="true">#</a> 作为子查询的替代品</h4><p>IoTDB现在不支持子查询,但是我们可以通过创建连续查询得到相似的功能。我们可以将子查询注册为一个连续查询,并将子查询的结果物化到目标序列中,外层查询再直接查询哪个目标序列。</p><h5 id="例子-2" tabindex="-1"><a class="header-anchor" href="#例子-2" aria-hidden="true">#</a> 例子</h5><p>IoTDB并不会接收如下的嵌套子查询。这个查询会计算s1序列每隔30分钟的非空值数量的平均值:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">SELECT</span> <span class="token function">avg</span><span class="token punctuation">(</span>count_s1<span class="token punctuation">)</span> <span class="token keyword">from</span> <span class="token punctuation">(</span><span class="token keyword">select</span> <span class="token function">count</span><span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">as</span> count_s1 <span class="token keyword">from</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">.</span>d <span class="token keyword">group</span> <span class="token keyword">by</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">30</span>m<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>为了得到相同的结果,我们可以:</p><p><strong>1. 创建一个连续查询</strong></p><p>这一步执行内层子查询部分。下面创建的连续查询每隔30分钟计算一次<code>root.sg.d.s1</code>序列的非空值数量,并将结果写入目标序列<code>root.sg_count.d.count_s1</code>中。</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">CREATE</span> CQ s1_count_cq |
| <span class="token keyword">BEGIN</span> |
| <span class="token keyword">SELECT</span> <span class="token function">count</span><span class="token punctuation">(</span>s1<span class="token punctuation">)</span> |
| <span class="token keyword">INTO</span> root<span class="token punctuation">.</span>sg_count<span class="token punctuation">.</span>d<span class="token punctuation">.</span>count_s1 |
| <span class="token keyword">FROM</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">.</span>d |
| <span class="token keyword">GROUP</span> <span class="token keyword">BY</span><span class="token punctuation">(</span><span class="token number">30</span>m<span class="token punctuation">)</span> |
| <span class="token keyword">END</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>2. 查询连续查询的结果</strong></p><p>这一步执行外层查询的avg([...])部分。</p><p>查询序列<code>root.sg_count.d.count_s1</code>的值,并计算平均值:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">SELECT</span> <span class="token function">avg</span><span class="token punctuation">(</span>count_s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>sg_count<span class="token punctuation">.</span>d<span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h3 id="连续查询相关的配置参数" tabindex="-1"><a class="header-anchor" href="#连续查询相关的配置参数" aria-hidden="true">#</a> 连续查询相关的配置参数</h3><table><thead><tr><th style="text-align:left;">参数名</th><th>描述</th><th>类型</th><th>默认值</th></tr></thead><tbody><tr><td style="text-align:left;"><code>continuous_query_submit_thread</code></td><td>用于周期性提交连续查询执行任务的线程数</td><td>int32</td><td>2</td></tr><tr><td style="text-align:left;"><code>continuous_query_min_every_interval_in_ms</code></td><td>系统允许的连续查询最小的周期性时间间隔</td><td>duration</td><td>1000</td></tr></tbody></table><h2 id="用户自定义函数" tabindex="-1"><a class="header-anchor" href="#用户自定义函数" aria-hidden="true">#</a> 用户自定义函数</h2><h3 id="数据质量函数" tabindex="-1"><a class="header-anchor" href="#数据质量函数" aria-hidden="true">#</a> 数据质量函数</h3><h4 id="completeness" tabindex="-1"><a class="header-anchor" href="#completeness" aria-hidden="true">#</a> Completeness</h4><h5 id="函数简介" tabindex="-1"><a class="header-anchor" href="#函数简介" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算时间序列的完整性。将输入序列划分为若干个连续且不重叠的窗口,分别计算每一个窗口的完整性,并输出窗口第一个数据点的时间戳和窗口的完整性。</p><p><strong>函数名:</strong> COMPLETENESS</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>window</code>:窗口大小,它是一个大于0的整数或者一个有单位的正数。前者代表每一个窗口包含的数据点数目,最后一个窗口的数据点数目可能会不足;后者代表窗口的时间跨度,目前支持五种单位,分别是'ms'(毫秒)、's'(秒)、'm'(分钟)、'h'(小时)和'd'(天)。缺省情况下,全部输入数据都属于同一个窗口。</li><li><code>downtime</code>:完整性计算是否考虑停机异常。它的取值为 'true' 或 'false',默认值为 'true'. 在考虑停机异常时,长时间的数据缺失将被视作停机,不对完整性产生影响。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为DOUBLE,其中每一个数据点的值的范围都是 [0,1].</p><p><strong>提示:</strong> 只有当窗口内的数据点数目超过10时,才会进行完整性计算。否则,该窗口将被忽略,不做任何输出。</p><h5 id="使用示例" tabindex="-1"><a class="header-anchor" href="#使用示例" aria-hidden="true">#</a> 使用示例</h5><h6 id="参数缺省" tabindex="-1"><a class="header-anchor" href="#参数缺省" aria-hidden="true">#</a> 参数缺省</h6><p>在参数缺省的情况下,本函数将会把全部输入数据都作为同一个窗口计算完整性。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 120.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> completeness<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">00</span>:<span class="token number">30</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------------------+ |
| | Time|completeness(root.test.d1.s1)| |
| +-----------------------------+-----------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 0.875| |
| +-----------------------------+-----------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="指定窗口大小" tabindex="-1"><a class="header-anchor" href="#指定窗口大小" aria-hidden="true">#</a> 指定窗口大小</h6><p>在指定窗口大小的情况下,本函数会把输入数据划分为若干个窗口计算完整性。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 120.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| |
| |2020-01-01T00:00:32.000+08:00| 130.0| |
| |2020-01-01T00:00:34.000+08:00| 132.0| |
| |2020-01-01T00:00:36.000+08:00| 134.0| |
| |2020-01-01T00:00:38.000+08:00| 136.0| |
| |2020-01-01T00:00:40.000+08:00| 138.0| |
| |2020-01-01T00:00:42.000+08:00| 140.0| |
| |2020-01-01T00:00:44.000+08:00| 142.0| |
| |2020-01-01T00:00:46.000+08:00| 144.0| |
| |2020-01-01T00:00:48.000+08:00| 146.0| |
| |2020-01-01T00:00:50.000+08:00| 148.0| |
| |2020-01-01T00:00:52.000+08:00| 150.0| |
| |2020-01-01T00:00:54.000+08:00| 152.0| |
| |2020-01-01T00:00:56.000+08:00| 154.0| |
| |2020-01-01T00:00:58.000+08:00| 156.0| |
| |2020-01-01T00:01:00.000+08:00| 158.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> completeness<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">"window"</span><span class="token operator">=</span><span class="token string">"15"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">01</span>:<span class="token number">00</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------------------------------+ |
| | Time|completeness(root.test.d1.s1, "window"="15")| |
| +-----------------------------+--------------------------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 0.875| |
| |2020-01-01T00:00:32.000+08:00| 1.0| |
| +-----------------------------+--------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="consistency" tabindex="-1"><a class="header-anchor" href="#consistency" aria-hidden="true">#</a> Consistency</h4><h5 id="函数简介-1" tabindex="-1"><a class="header-anchor" href="#函数简介-1" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算时间序列的一致性。将输入序列划分为若干个连续且不重叠的窗口,分别计算每一个窗口的一致性,并输出窗口第一个数据点的时间戳和窗口的时效性。</p><p><strong>函数名:</strong> CONSISTENCY</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>window</code>:窗口大小,它是一个大于0的整数或者一个有单位的正数。前者代表每一个窗口包含的数据点数目,最后一个窗口的数据点数目可能会不足;后者代表窗口的时间跨度,目前支持五种单位,分别是 'ms'(毫秒)、's'(秒)、'm'(分钟)、'h'(小时)和'd'(天)。缺省情况下,全部输入数据都属于同一个窗口。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为DOUBLE,其中每一个数据点的值的范围都是 [0,1].</p><p><strong>提示:</strong> 只有当窗口内的数据点数目超过10时,才会进行一致性计算。否则,该窗口将被忽略,不做任何输出。</p><h5 id="使用示例-1" tabindex="-1"><a class="header-anchor" href="#使用示例-1" aria-hidden="true">#</a> 使用示例</h5><h6 id="参数缺省-1" tabindex="-1"><a class="header-anchor" href="#参数缺省-1" aria-hidden="true">#</a> 参数缺省</h6><p>在参数缺省的情况下,本函数将会把全部输入数据都作为同一个窗口计算一致性。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 120.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> consistency<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">00</span>:<span class="token number">30</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+----------------------------+ |
| | Time|consistency(root.test.d1.s1)| |
| +-----------------------------+----------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 0.9333333333333333| |
| +-----------------------------+----------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="指定窗口大小-1" tabindex="-1"><a class="header-anchor" href="#指定窗口大小-1" aria-hidden="true">#</a> 指定窗口大小</h6><p>在指定窗口大小的情况下,本函数会把输入数据划分为若干个窗口计算一致性。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 120.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| |
| |2020-01-01T00:00:32.000+08:00| 130.0| |
| |2020-01-01T00:00:34.000+08:00| 132.0| |
| |2020-01-01T00:00:36.000+08:00| 134.0| |
| |2020-01-01T00:00:38.000+08:00| 136.0| |
| |2020-01-01T00:00:40.000+08:00| 138.0| |
| |2020-01-01T00:00:42.000+08:00| 140.0| |
| |2020-01-01T00:00:44.000+08:00| 142.0| |
| |2020-01-01T00:00:46.000+08:00| 144.0| |
| |2020-01-01T00:00:48.000+08:00| 146.0| |
| |2020-01-01T00:00:50.000+08:00| 148.0| |
| |2020-01-01T00:00:52.000+08:00| 150.0| |
| |2020-01-01T00:00:54.000+08:00| 152.0| |
| |2020-01-01T00:00:56.000+08:00| 154.0| |
| |2020-01-01T00:00:58.000+08:00| 156.0| |
| |2020-01-01T00:01:00.000+08:00| 158.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> consistency<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">"window"</span><span class="token operator">=</span><span class="token string">"15"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">01</span>:<span class="token number">00</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------------------------+ |
| | Time|consistency(root.test.d1.s1, "window"="15")| |
| +-----------------------------+-------------------------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 0.9333333333333333| |
| |2020-01-01T00:00:32.000+08:00| 1.0| |
| +-----------------------------+-------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="timeliness" tabindex="-1"><a class="header-anchor" href="#timeliness" aria-hidden="true">#</a> Timeliness</h4><h5 id="函数简介-2" tabindex="-1"><a class="header-anchor" href="#函数简介-2" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算时间序列的时效性。将输入序列划分为若干个连续且不重叠的窗口,分别计算每一个窗口的时效性,并输出窗口第一个数据点的时间戳和窗口的时效性。</p><p><strong>函数名:</strong> TIMELINESS</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>window</code>:窗口大小,它是一个大于0的整数或者一个有单位的正数。前者代表每一个窗口包含的数据点数目,最后一个窗口的数据点数目可能会不足;后者代表窗口的时间跨度,目前支持五种单位,分别是 'ms'(毫秒)、's'(秒)、'm'(分钟)、'h'(小时)和'd'(天)。缺省情况下,全部输入数据都属于同一个窗口。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为DOUBLE,其中每一个数据点的值的范围都是 [0,1].</p><p><strong>提示:</strong> 只有当窗口内的数据点数目超过10时,才会进行时效性计算。否则,该窗口将被忽略,不做任何输出。</p><h5 id="使用示例-2" tabindex="-1"><a class="header-anchor" href="#使用示例-2" aria-hidden="true">#</a> 使用示例</h5><h6 id="参数缺省-2" tabindex="-1"><a class="header-anchor" href="#参数缺省-2" aria-hidden="true">#</a> 参数缺省</h6><p>在参数缺省的情况下,本函数将会把全部输入数据都作为同一个窗口计算时效性。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 120.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> timeliness<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">00</span>:<span class="token number">30</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------------------+ |
| | Time|timeliness(root.test.d1.s1)| |
| +-----------------------------+---------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 0.9333333333333333| |
| +-----------------------------+---------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="指定窗口大小-2" tabindex="-1"><a class="header-anchor" href="#指定窗口大小-2" aria-hidden="true">#</a> 指定窗口大小</h6><p>在指定窗口大小的情况下,本函数会把输入数据划分为若干个窗口计算时效性。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 120.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| |
| |2020-01-01T00:00:32.000+08:00| 130.0| |
| |2020-01-01T00:00:34.000+08:00| 132.0| |
| |2020-01-01T00:00:36.000+08:00| 134.0| |
| |2020-01-01T00:00:38.000+08:00| 136.0| |
| |2020-01-01T00:00:40.000+08:00| 138.0| |
| |2020-01-01T00:00:42.000+08:00| 140.0| |
| |2020-01-01T00:00:44.000+08:00| 142.0| |
| |2020-01-01T00:00:46.000+08:00| 144.0| |
| |2020-01-01T00:00:48.000+08:00| 146.0| |
| |2020-01-01T00:00:50.000+08:00| 148.0| |
| |2020-01-01T00:00:52.000+08:00| 150.0| |
| |2020-01-01T00:00:54.000+08:00| 152.0| |
| |2020-01-01T00:00:56.000+08:00| 154.0| |
| |2020-01-01T00:00:58.000+08:00| 156.0| |
| |2020-01-01T00:01:00.000+08:00| 158.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> timeliness<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">"window"</span><span class="token operator">=</span><span class="token string">"15"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">01</span>:<span class="token number">00</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------------+ |
| | Time|timeliness(root.test.d1.s1, "window"="15")| |
| +-----------------------------+------------------------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 0.9333333333333333| |
| |2020-01-01T00:00:32.000+08:00| 1.0| |
| +-----------------------------+------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="validity" tabindex="-1"><a class="header-anchor" href="#validity" aria-hidden="true">#</a> Validity</h4><h5 id="函数简介-3" tabindex="-1"><a class="header-anchor" href="#函数简介-3" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算时间序列的有效性。将输入序列划分为若干个连续且不重叠的窗口,分别计算每一个窗口的有效性,并输出窗口第一个数据点的时间戳和窗口的有效性。</p><p><strong>函数名:</strong> VALIDITY</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>window</code>:窗口大小,它是一个大于0的整数或者一个有单位的正数。前者代表每一个窗口包含的数据点数目,最后一个窗口的数据点数目可能会不足;后者代表窗口的时间跨度,目前支持五种单位,分别是 'ms'(毫秒)、's'(秒)、'm'(分钟)、'h'(小时)和'd'(天)。缺省情况下,全部输入数据都属于同一个窗口。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为DOUBLE,其中每一个数据点的值的范围都是 [0,1].</p><p><strong>提示:</strong> 只有当窗口内的数据点数目超过10时,才会进行有效性计算。否则,该窗口将被忽略,不做任何输出。</p><h5 id="使用示例-3" tabindex="-1"><a class="header-anchor" href="#使用示例-3" aria-hidden="true">#</a> 使用示例</h5><h6 id="参数缺省-3" tabindex="-1"><a class="header-anchor" href="#参数缺省-3" aria-hidden="true">#</a> 参数缺省</h6><p>在参数缺省的情况下,本函数将会把全部输入数据都作为同一个窗口计算有效性。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 120.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> validity<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">00</span>:<span class="token number">30</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------+ |
| | Time|validity(root.test.d1.s1)| |
| +-----------------------------+-------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 0.8833333333333333| |
| +-----------------------------+-------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="指定窗口大小-3" tabindex="-1"><a class="header-anchor" href="#指定窗口大小-3" aria-hidden="true">#</a> 指定窗口大小</h6><p>在指定窗口大小的情况下,本函数会把输入数据划分为若干个窗口计算有效性。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 120.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| |
| |2020-01-01T00:00:32.000+08:00| 130.0| |
| |2020-01-01T00:00:34.000+08:00| 132.0| |
| |2020-01-01T00:00:36.000+08:00| 134.0| |
| |2020-01-01T00:00:38.000+08:00| 136.0| |
| |2020-01-01T00:00:40.000+08:00| 138.0| |
| |2020-01-01T00:00:42.000+08:00| 140.0| |
| |2020-01-01T00:00:44.000+08:00| 142.0| |
| |2020-01-01T00:00:46.000+08:00| 144.0| |
| |2020-01-01T00:00:48.000+08:00| 146.0| |
| |2020-01-01T00:00:50.000+08:00| 148.0| |
| |2020-01-01T00:00:52.000+08:00| 150.0| |
| |2020-01-01T00:00:54.000+08:00| 152.0| |
| |2020-01-01T00:00:56.000+08:00| 154.0| |
| |2020-01-01T00:00:58.000+08:00| 156.0| |
| |2020-01-01T00:01:00.000+08:00| 158.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> validity<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">"window"</span><span class="token operator">=</span><span class="token string">"15"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">01</span>:<span class="token number">00</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+----------------------------------------+ |
| | Time|validity(root.test.d1.s1, "window"="15")| |
| +-----------------------------+----------------------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 0.8833333333333333| |
| |2020-01-01T00:00:32.000+08:00| 1.0| |
| +-----------------------------+----------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="accuracy" tabindex="-1"><a class="header-anchor" href="#accuracy" aria-hidden="true">#</a> Accuracy</h4><h5 id="函数简介-4" tabindex="-1"><a class="header-anchor" href="#函数简介-4" aria-hidden="true">#</a> 函数简介</h5><p>本函数基于主数据计算原始时间序列的准确性。</p><p><strong>函数名</strong>:Accuracy</p><p><strong>输入序列:</strong> 支持多个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>omega</code>:算法窗口大小,非负整数(单位为毫秒), 在缺省情况下,算法根据不同时间差下的两个元组距离自动估计该参数。</li><li><code>eta</code>:算法距离阈值,正数, 在缺省情况下,算法根据窗口中元组的距离分布自动估计该参数。</li><li><code>k</code>:主数据中的近邻数量,正整数, 在缺省情况下,算法根据主数据中的k个近邻的元组距离自动估计该参数。</li></ul><p><strong>输出序列</strong>:输出单个值,类型为DOUBLE,值的范围为[0,1]。</p><h5 id="使用示例-4" tabindex="-1"><a class="header-anchor" href="#使用示例-4" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+------------+------------+------------+------------+------------+ |
| | Time|root.test.t1|root.test.t2|root.test.t3|root.test.m1|root.test.m2|root.test.m3| |
| +-----------------------------+------------+------------+------------+------------+------------+------------+ |
| |2021-07-01T12:00:01.000+08:00| 1704| 1154.55| 0.195| 1704| 1154.55| 0.195| |
| |2021-07-01T12:00:02.000+08:00| 1702| 1152.30| 0.193| 1702| 1152.30| 0.193| |
| |2021-07-01T12:00:03.000+08:00| 1702| 1148.65| 0.192| 1702| 1148.65| 0.192| |
| |2021-07-01T12:00:04.000+08:00| 1701| 1145.20| 0.194| 1701| 1145.20| 0.194| |
| |2021-07-01T12:00:07.000+08:00| 1703| 1150.55| 0.195| 1703| 1150.55| 0.195| |
| |2021-07-01T12:00:08.000+08:00| 1694| 1151.55| 0.193| 1704| 1151.55| 0.193| |
| |2021-07-01T12:01:09.000+08:00| 1705| 1153.55| 0.194| 1705| 1153.55| 0.194| |
| |2021-07-01T12:01:10.000+08:00| 1706| 1152.30| 0.190| 1706| 1152.30| 0.190| |
| +-----------------------------+------------+------------+------------+------------+------------+------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> Accuracy<span class="token punctuation">(</span>t1<span class="token punctuation">,</span>t2<span class="token punctuation">,</span>t3<span class="token punctuation">,</span>m1<span class="token punctuation">,</span>m2<span class="token punctuation">,</span>m3<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------------------------------------------------------------------------------+ |
| | Time|Accuracy(root.test.t1,root.test.t2,root.test.t3,root.test.m1,root.test.m2,root.test.m3)| |
| +-----------------------------+---------------------------------------------------------------------------------------+ |
| |2021-07-01T12:00:01.000+08:00| 0.875| |
| +-----------------------------+---------------------------------------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="趋势计算函数" tabindex="-1"><a class="header-anchor" href="#趋势计算函数" aria-hidden="true">#</a> 趋势计算函数</h3><p>目前 IoTDB 支持如下趋势计算函数:</p><table><thead><tr><th>函数名</th><th>输入序列类型</th><th>输出序列类型</th><th>功能描述</th></tr></thead><tbody><tr><td>TIME_DIFFERENCE</td><td>INT32 / INT64 / FLOAT / DOUBLE / BOOLEAN / TEXT</td><td>INT64</td><td>统计序列中某数据点的时间戳与前一数据点时间戳的差。范围内第一个数据点没有对应的结果输出。</td></tr><tr><td>DIFFERENCE</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>与输入序列的实际类型一致</td><td>统计序列中某数据点的值与前一数据点的值的差。范围内第一个数据点没有对应的结果输出。</td></tr><tr><td>NON_NEGATIVE_DIFFERENCE</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>与输入序列的实际类型一致</td><td>统计序列中某数据点的值与前一数据点的值的差的绝对值。范围内第一个数据点没有对应的结果输出。</td></tr><tr><td>DERIVATIVE</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td>统计序列中某数据点相对于前一数据点的变化率,数量上等同于 DIFFERENCE / TIME_DIFFERENCE。范围内第一个数据点没有对应的结果输出。</td></tr><tr><td>NON_NEGATIVE_DERIVATIVE</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td>统计序列中某数据点相对于前一数据点的变化率的绝对值,数量上等同于 NON_NEGATIVE_DIFFERENCE / TIME_DIFFERENCE。范围内第一个数据点没有对应的结果输出。</td></tr></tbody></table><p>例如:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> s1<span class="token punctuation">,</span> time_difference<span class="token punctuation">(</span>s1<span class="token punctuation">)</span><span class="token punctuation">,</span> difference<span class="token punctuation">(</span>s1<span class="token punctuation">)</span><span class="token punctuation">,</span> non_negative_difference<span class="token punctuation">(</span>s1<span class="token punctuation">)</span><span class="token punctuation">,</span> derivative<span class="token punctuation">(</span>s1<span class="token punctuation">)</span><span class="token punctuation">,</span> non_negative_derivative<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1 <span class="token keyword">limit</span> <span class="token number">5</span> <span class="token keyword">offset</span> <span class="token number">1000</span><span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>结果:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------+-------------------------------+--------------------------+---------------------------------------+--------------------------+---------------------------------------+ |
| | Time| root.sg1.d1.s1|time_difference(root.sg1.d1.s1)|difference(root.sg1.d1.s1)|non_negative_difference(root.sg1.d1.s1)|derivative(root.sg1.d1.s1)|non_negative_derivative(root.sg1.d1.s1)| |
| +-----------------------------+-------------------+-------------------------------+--------------------------+---------------------------------------+--------------------------+---------------------------------------+ |
| |2020-12-10T17:11:49.037+08:00|7360723084922759782| 1| -8431715764844238876| 8431715764844238876| -8.4317157648442388E18| 8.4317157648442388E18| |
| |2020-12-10T17:11:49.038+08:00|4377791063319964531| 1| -2982932021602795251| 2982932021602795251| -2.982932021602795E18| 2.982932021602795E18| |
| |2020-12-10T17:11:49.039+08:00|7972485567734642915| 1| 3594694504414678384| 3594694504414678384| 3.5946945044146785E18| 3.5946945044146785E18| |
| |2020-12-10T17:11:49.040+08:00|2508858212791964081| 1| -5463627354942678834| 5463627354942678834| -5.463627354942679E18| 5.463627354942679E18| |
| |2020-12-10T17:11:49.041+08:00|2817297431185141819| 1| 308439218393177738| 308439218393177738| 3.0843921839317773E17| 3.0843921839317773E17| |
| +-----------------------------+-------------------+-------------------------------+--------------------------+---------------------------------------+--------------------------+---------------------------------------+ |
| Total line number = 5 |
| It costs 0.014s |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><table><thead><tr><th>函数名</th><th>输入序列类型</th><th>参数</th><th>输出序列类型</th><th>功能描述</th></tr></thead><tbody><tr><td>DIFF</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td><code>ignoreNull</code>:可选,默认为true;为true时,前一个数据点值为null时,忽略该数据点继续向前找到第一个出现的不为null的值;为false时,如果前一个数据点为null,则不忽略,使用null进行相减,结果也为null</td><td>DOUBLE</td><td>统计序列中某数据点的值与前一数据点的值的差。第一个数据点没有对应的结果输出,输出值为null</td></tr></tbody></table><h4 id="使用示例-5" tabindex="-1"><a class="header-anchor" href="#使用示例-5" aria-hidden="true">#</a> 使用示例</h4><h5 id="原始数据" tabindex="-1"><a class="header-anchor" href="#原始数据" aria-hidden="true">#</a> 原始数据</h5><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+------------+ |
| | Time|root.test.s1|root.test.s2| |
| +-----------------------------+------------+------------+ |
| |1970-01-01T08:00:00.001+08:00| 1| 1.0| |
| |1970-01-01T08:00:00.002+08:00| 2| null| |
| |1970-01-01T08:00:00.003+08:00| null| 3.0| |
| |1970-01-01T08:00:00.004+08:00| 4| null| |
| |1970-01-01T08:00:00.005+08:00| 5| 5.0| |
| |1970-01-01T08:00:00.006+08:00| null| 6.0| |
| +-----------------------------+------------+------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5 id="不使用ignorenull参数-忽略null" tabindex="-1"><a class="header-anchor" href="#不使用ignorenull参数-忽略null" aria-hidden="true">#</a> 不使用ignoreNull参数(忽略null)</h5><p>SQL:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">SELECT</span> DIFF<span class="token punctuation">(</span>s1<span class="token punctuation">)</span><span class="token punctuation">,</span> DIFF<span class="token punctuation">(</span>s2<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------+------------------+ |
| | Time|DIFF(root.test.s1)|DIFF(root.test.s2)| |
| +-----------------------------+------------------+------------------+ |
| |1970-01-01T08:00:00.001+08:00| null| null| |
| |1970-01-01T08:00:00.002+08:00| 1.0| null| |
| |1970-01-01T08:00:00.003+08:00| null| 2.0| |
| |1970-01-01T08:00:00.004+08:00| 2.0| null| |
| |1970-01-01T08:00:00.005+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.006+08:00| null| 1.0| |
| +-----------------------------+------------------+------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5 id="使用ignorenull参数" tabindex="-1"><a class="header-anchor" href="#使用ignorenull参数" aria-hidden="true">#</a> 使用ignoreNull参数</h5><p>SQL:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">SELECT</span> DIFF<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">'ignoreNull'</span><span class="token operator">=</span><span class="token string">'false'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> DIFF<span class="token punctuation">(</span>s2<span class="token punctuation">,</span> <span class="token string">'ignoreNull'</span><span class="token operator">=</span><span class="token string">'false'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+----------------------------------------+----------------------------------------+ |
| | Time|DIFF(root.test.s1, "ignoreNull"="false")|DIFF(root.test.s2, "ignoreNull"="false")| |
| +-----------------------------+----------------------------------------+----------------------------------------+ |
| |1970-01-01T08:00:00.001+08:00| null| null| |
| |1970-01-01T08:00:00.002+08:00| 1.0| null| |
| |1970-01-01T08:00:00.003+08:00| null| null| |
| |1970-01-01T08:00:00.004+08:00| null| null| |
| |1970-01-01T08:00:00.005+08:00| 1.0| null| |
| |1970-01-01T08:00:00.006+08:00| null| 1.0| |
| +-----------------------------+----------------------------------------+----------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="采样函数" tabindex="-1"><a class="header-anchor" href="#采样函数" aria-hidden="true">#</a> 采样函数</h3><h4 id="等数量分桶降采样函数" tabindex="-1"><a class="header-anchor" href="#等数量分桶降采样函数" aria-hidden="true">#</a> 等数量分桶降采样函数</h4><p>本函数对输入序列进行等数量分桶采样,即根据用户给定的降采样比例和降采样方法将输入序列按固定点数等分为若干桶。在每个桶内通过给定的采样方法进行采样。</p><h5 id="等数量分桶随机采样" tabindex="-1"><a class="header-anchor" href="#等数量分桶随机采样" aria-hidden="true">#</a> 等数量分桶随机采样</h5><p>对等数量分桶后,桶内进行随机采样。</p><table><thead><tr><th>函数名</th><th>可接收的输入序列类型</th><th>必要的属性参数</th><th>输出序列类型</th><th>功能类型</th></tr></thead><tbody><tr><td>EQUAL_SIZE_BUCKET_RANDOM_SAMPLE</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>降采样比例 <code>proportion</code>,取值范围为<code>(0, 1]</code>,默认为<code>0.1</code></td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>返回符合采样比例的等分桶随机采样</td></tr></tbody></table><h6 id="使用示例-6" tabindex="-1"><a class="header-anchor" href="#使用示例-6" aria-hidden="true">#</a> 使用示例</h6><p>输入序列:<code>root.ln.wf01.wt01.temperature</code>从<code>0.0-99.0</code>共<code>100</code>条数据。</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>IoTDB> select temperature from root.ln.wf01.wt01; |
| +-----------------------------+-----------------------------+ |
| | Time|root.ln.wf01.wt01.temperature| |
| +-----------------------------+-----------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.0| |
| |1970-01-01T08:00:00.001+08:00| 1.0| |
| |1970-01-01T08:00:00.002+08:00| 2.0| |
| |1970-01-01T08:00:00.003+08:00| 3.0| |
| |1970-01-01T08:00:00.004+08:00| 4.0| |
| |1970-01-01T08:00:00.005+08:00| 5.0| |
| |1970-01-01T08:00:00.006+08:00| 6.0| |
| |1970-01-01T08:00:00.007+08:00| 7.0| |
| |1970-01-01T08:00:00.008+08:00| 8.0| |
| |1970-01-01T08:00:00.009+08:00| 9.0| |
| |1970-01-01T08:00:00.010+08:00| 10.0| |
| |1970-01-01T08:00:00.011+08:00| 11.0| |
| |1970-01-01T08:00:00.012+08:00| 12.0| |
| |.............................|.............................| |
| |1970-01-01T08:00:00.089+08:00| 89.0| |
| |1970-01-01T08:00:00.090+08:00| 90.0| |
| |1970-01-01T08:00:00.091+08:00| 91.0| |
| |1970-01-01T08:00:00.092+08:00| 92.0| |
| |1970-01-01T08:00:00.093+08:00| 93.0| |
| |1970-01-01T08:00:00.094+08:00| 94.0| |
| |1970-01-01T08:00:00.095+08:00| 95.0| |
| |1970-01-01T08:00:00.096+08:00| 96.0| |
| |1970-01-01T08:00:00.097+08:00| 97.0| |
| |1970-01-01T08:00:00.098+08:00| 98.0| |
| |1970-01-01T08:00:00.099+08:00| 99.0| |
| +-----------------------------+-----------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>sql:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> equal_size_bucket_random_sample<span class="token punctuation">(</span>temperature<span class="token punctuation">,</span><span class="token string">'proportion'</span><span class="token operator">=</span><span class="token string">'0.1'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> random_sample <span class="token keyword">from</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf01<span class="token punctuation">.</span>wt01<span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>结果:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------+ |
| | Time|random_sample| |
| +-----------------------------+-------------+ |
| |1970-01-01T08:00:00.007+08:00| 7.0| |
| |1970-01-01T08:00:00.014+08:00| 14.0| |
| |1970-01-01T08:00:00.020+08:00| 20.0| |
| |1970-01-01T08:00:00.035+08:00| 35.0| |
| |1970-01-01T08:00:00.047+08:00| 47.0| |
| |1970-01-01T08:00:00.059+08:00| 59.0| |
| |1970-01-01T08:00:00.063+08:00| 63.0| |
| |1970-01-01T08:00:00.079+08:00| 79.0| |
| |1970-01-01T08:00:00.086+08:00| 86.0| |
| |1970-01-01T08:00:00.096+08:00| 96.0| |
| +-----------------------------+-------------+ |
| Total line number = 10 |
| It costs 0.024s |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5 id="等数量分桶聚合采样" tabindex="-1"><a class="header-anchor" href="#等数量分桶聚合采样" aria-hidden="true">#</a> 等数量分桶聚合采样</h5><p>采用聚合采样法对输入序列进行采样,用户需要另外提供一个聚合函数参数即</p><ul><li><code>type</code>:聚合类型,取值为<code>avg</code>或<code>max</code>或<code>min</code>或<code>sum</code>或<code>extreme</code>或<code>variance</code>。在缺省情况下,采用<code>avg</code>。其中<code>extreme</code>表示等分桶中,绝对值最大的值。<code>variance</code>表示采样等分桶中的方差。</li></ul><p>每个桶采样输出的时间戳为这个桶第一个点的时间戳</p><table><thead><tr><th>函数名</th><th>可接收的输入序列类型</th><th>必要的属性参数</th><th>输出序列类型</th><th>功能类型</th></tr></thead><tbody><tr><td>EQUAL_SIZE_BUCKET_AGG_SAMPLE</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td><code>proportion</code>取值范围为<code>(0, 1]</code>,默认为<code>0.1</code><br><code>type</code>:取值类型有<code>avg</code>, <code>max</code>, <code>min</code>, <code>sum</code>, <code>extreme</code>, <code>variance</code>, 默认为<code>avg</code></td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>返回符合采样比例的等分桶聚合采样</td></tr></tbody></table><h6 id="使用示例-7" tabindex="-1"><a class="header-anchor" href="#使用示例-7" aria-hidden="true">#</a> 使用示例</h6><p>输入序列:<code>root.ln.wf01.wt01.temperature</code>从<code>0.0-99.0</code>共<code>100</code>条有序数据,同等分桶随机采样的测试数据。</p><p>sql:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> equal_size_bucket_agg_sample<span class="token punctuation">(</span>temperature<span class="token punctuation">,</span> <span class="token string">'type'</span><span class="token operator">=</span><span class="token string">'avg'</span><span class="token punctuation">,</span><span class="token string">'proportion'</span><span class="token operator">=</span><span class="token string">'0.1'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> agg_avg<span class="token punctuation">,</span> equal_size_bucket_agg_sample<span class="token punctuation">(</span>temperature<span class="token punctuation">,</span> <span class="token string">'type'</span><span class="token operator">=</span><span class="token string">'max'</span><span class="token punctuation">,</span><span class="token string">'proportion'</span><span class="token operator">=</span><span class="token string">'0.1'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> agg_max<span class="token punctuation">,</span> equal_size_bucket_agg_sample<span class="token punctuation">(</span>temperature<span class="token punctuation">,</span><span class="token string">'type'</span><span class="token operator">=</span><span class="token string">'min'</span><span class="token punctuation">,</span><span class="token string">'proportion'</span><span class="token operator">=</span><span class="token string">'0.1'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> agg_min<span class="token punctuation">,</span> equal_size_bucket_agg_sample<span class="token punctuation">(</span>temperature<span class="token punctuation">,</span> <span class="token string">'type'</span><span class="token operator">=</span><span class="token string">'sum'</span><span class="token punctuation">,</span><span class="token string">'proportion'</span><span class="token operator">=</span><span class="token string">'0.1'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> agg_sum<span class="token punctuation">,</span> equal_size_bucket_agg_sample<span class="token punctuation">(</span>temperature<span class="token punctuation">,</span> <span class="token string">'type'</span><span class="token operator">=</span><span class="token string">'extreme'</span><span class="token punctuation">,</span><span class="token string">'proportion'</span><span class="token operator">=</span><span class="token string">'0.1'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> agg_extreme<span class="token punctuation">,</span> equal_size_bucket_agg_sample<span class="token punctuation">(</span>temperature<span class="token punctuation">,</span> <span class="token string">'type'</span><span class="token operator">=</span><span class="token string">'variance'</span><span class="token punctuation">,</span><span class="token string">'proportion'</span><span class="token operator">=</span><span class="token string">'0.1'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> agg_variance <span class="token keyword">from</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf01<span class="token punctuation">.</span>wt01<span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>结果:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------+-------+-------+-------+-----------+------------+ |
| | Time| agg_avg|agg_max|agg_min|agg_sum|agg_extreme|agg_variance| |
| +-----------------------------+-----------------+-------+-------+-------+-----------+------------+ |
| |1970-01-01T08:00:00.000+08:00| 4.5| 9.0| 0.0| 45.0| 9.0| 8.25| |
| |1970-01-01T08:00:00.010+08:00| 14.5| 19.0| 10.0| 145.0| 19.0| 8.25| |
| |1970-01-01T08:00:00.020+08:00| 24.5| 29.0| 20.0| 245.0| 29.0| 8.25| |
| |1970-01-01T08:00:00.030+08:00| 34.5| 39.0| 30.0| 345.0| 39.0| 8.25| |
| |1970-01-01T08:00:00.040+08:00| 44.5| 49.0| 40.0| 445.0| 49.0| 8.25| |
| |1970-01-01T08:00:00.050+08:00| 54.5| 59.0| 50.0| 545.0| 59.0| 8.25| |
| |1970-01-01T08:00:00.060+08:00| 64.5| 69.0| 60.0| 645.0| 69.0| 8.25| |
| |1970-01-01T08:00:00.070+08:00|74.50000000000001| 79.0| 70.0| 745.0| 79.0| 8.25| |
| |1970-01-01T08:00:00.080+08:00| 84.5| 89.0| 80.0| 845.0| 89.0| 8.25| |
| |1970-01-01T08:00:00.090+08:00| 94.5| 99.0| 90.0| 945.0| 99.0| 8.25| |
| +-----------------------------+-----------------+-------+-------+-------+-----------+------------+ |
| Total line number = 10 |
| It costs 0.044s |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5 id="等数量分桶-m4-采样" tabindex="-1"><a class="header-anchor" href="#等数量分桶-m4-采样" aria-hidden="true">#</a> 等数量分桶 M4 采样</h5><p>采用M4采样法对输入序列进行采样。即对于每个桶采样首、尾、最小和最大值。</p><table><thead><tr><th>函数名</th><th>可接收的输入序列类型</th><th>必要的属性参数</th><th>输出序列类型</th><th>功能类型</th></tr></thead><tbody><tr><td>EQUAL_SIZE_BUCKET_M4_SAMPLE</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td><code>proportion</code>取值范围为<code>(0, 1]</code>,默认为<code>0.1</code></td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>返回符合采样比例的等分桶M4采样</td></tr></tbody></table><h6 id="使用示例-8" tabindex="-1"><a class="header-anchor" href="#使用示例-8" aria-hidden="true">#</a> 使用示例</h6><p>输入序列:<code>root.ln.wf01.wt01.temperature</code>从<code>0.0-99.0</code>共<code>100</code>条有序数据,同等分桶随机采样的测试数据。</p><p>sql:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> equal_size_bucket_m4_sample<span class="token punctuation">(</span>temperature<span class="token punctuation">,</span> <span class="token string">'proportion'</span><span class="token operator">=</span><span class="token string">'0.1'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> M4_sample <span class="token keyword">from</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf01<span class="token punctuation">.</span>wt01<span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>结果:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------+ |
| | Time|M4_sample| |
| +-----------------------------+---------+ |
| |1970-01-01T08:00:00.000+08:00| 0.0| |
| |1970-01-01T08:00:00.001+08:00| 1.0| |
| |1970-01-01T08:00:00.038+08:00| 38.0| |
| |1970-01-01T08:00:00.039+08:00| 39.0| |
| |1970-01-01T08:00:00.040+08:00| 40.0| |
| |1970-01-01T08:00:00.041+08:00| 41.0| |
| |1970-01-01T08:00:00.078+08:00| 78.0| |
| |1970-01-01T08:00:00.079+08:00| 79.0| |
| |1970-01-01T08:00:00.080+08:00| 80.0| |
| |1970-01-01T08:00:00.081+08:00| 81.0| |
| |1970-01-01T08:00:00.098+08:00| 98.0| |
| |1970-01-01T08:00:00.099+08:00| 99.0| |
| +-----------------------------+---------+ |
| Total line number = 12 |
| It costs 0.065s |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5 id="等数量分桶离群值采样" tabindex="-1"><a class="header-anchor" href="#等数量分桶离群值采样" aria-hidden="true">#</a> 等数量分桶离群值采样</h5><p>本函数对输入序列进行等数量分桶离群值采样,即根据用户给定的降采样比例和桶内采样个数将输入序列按固定点数等分为若干桶,在每个桶内通过给定的离群值采样方法进行采样。</p><table><thead><tr><th>函数名</th><th>可接收的输入序列类型</th><th>必要的属性参数</th><th>输出序列类型</th><th>功能类型</th></tr></thead><tbody><tr><td>EQUAL_SIZE_BUCKET_OUTLIER_SAMPLE</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td><code>proportion</code>取值范围为<code>(0, 1]</code>,默认为<code>0.1</code><br><code>type</code>取值为<code>avg</code>或<code>stendis</code>或<code>cos</code>或<code>prenextdis</code>,默认为<code>avg</code><br><code>number</code>取值应大于0,默认<code>3</code></td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>返回符合采样比例和桶内采样个数的等分桶离群值采样</td></tr></tbody></table><p>参数说明</p><ul><li><code>proportion</code>: 采样比例 <ul><li><code>number</code>: 每个桶内的采样个数,默认<code>3</code></li></ul></li><li><code>type</code>: 离群值采样方法,取值为 <ul><li><code>avg</code>: 取桶内数据点的平均值,并根据采样比例,找到距离均值最远的<code>top number</code>个</li><li><code>stendis</code>: 取桶内每一个数据点距离桶的首末数据点连成直线的垂直距离,并根据采样比例,找到距离最大的<code>top number</code>个</li><li><code>cos</code>: 设桶内一个数据点为b,b左边的数据点为a,b右边的数据点为c,则取ab与bc向量的夹角的余弦值,值越小,说明形成的角度越大,越可能是异常值。找到cos值最小的<code>top number</code>个</li><li><code>prenextdis</code>: 设桶内一个数据点为b,b左边的数据点为a,b右边的数据点为c,则取ab与bc的长度之和作为衡量标准,和越大越可能是异常值,找到最大的<code>top number</code>个</li></ul></li></ul><h6 id="使用示例-9" tabindex="-1"><a class="header-anchor" href="#使用示例-9" aria-hidden="true">#</a> 使用示例</h6><p>测试数据:<code>root.ln.wf01.wt01.temperature</code>从<code>0.0-99.0</code>共<code>100</code>条数据,其中为了加入离群值,我们使得个位数为5的值自增100。</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>IoTDB> select temperature from root.ln.wf01.wt01; |
| +-----------------------------+-----------------------------+ |
| | Time|root.ln.wf01.wt01.temperature| |
| +-----------------------------+-----------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.0| |
| |1970-01-01T08:00:00.001+08:00| 1.0| |
| |1970-01-01T08:00:00.002+08:00| 2.0| |
| |1970-01-01T08:00:00.003+08:00| 3.0| |
| |1970-01-01T08:00:00.004+08:00| 4.0| |
| |1970-01-01T08:00:00.005+08:00| 105.0| |
| |1970-01-01T08:00:00.006+08:00| 6.0| |
| |1970-01-01T08:00:00.007+08:00| 7.0| |
| |1970-01-01T08:00:00.008+08:00| 8.0| |
| |1970-01-01T08:00:00.009+08:00| 9.0| |
| |1970-01-01T08:00:00.010+08:00| 10.0| |
| |1970-01-01T08:00:00.011+08:00| 11.0| |
| |1970-01-01T08:00:00.012+08:00| 12.0| |
| |1970-01-01T08:00:00.013+08:00| 13.0| |
| |1970-01-01T08:00:00.014+08:00| 14.0| |
| |1970-01-01T08:00:00.015+08:00| 115.0| |
| |1970-01-01T08:00:00.016+08:00| 16.0| |
| |.............................|.............................| |
| |1970-01-01T08:00:00.092+08:00| 92.0| |
| |1970-01-01T08:00:00.093+08:00| 93.0| |
| |1970-01-01T08:00:00.094+08:00| 94.0| |
| |1970-01-01T08:00:00.095+08:00| 195.0| |
| |1970-01-01T08:00:00.096+08:00| 96.0| |
| |1970-01-01T08:00:00.097+08:00| 97.0| |
| |1970-01-01T08:00:00.098+08:00| 98.0| |
| |1970-01-01T08:00:00.099+08:00| 99.0| |
| +-----------------------------+-----------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>sql:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> equal_size_bucket_outlier_sample<span class="token punctuation">(</span>temperature<span class="token punctuation">,</span> <span class="token string">'proportion'</span><span class="token operator">=</span><span class="token string">'0.1'</span><span class="token punctuation">,</span> <span class="token string">'type'</span><span class="token operator">=</span><span class="token string">'avg'</span><span class="token punctuation">,</span> <span class="token string">'number'</span><span class="token operator">=</span><span class="token string">'2'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> outlier_avg_sample<span class="token punctuation">,</span> equal_size_bucket_outlier_sample<span class="token punctuation">(</span>temperature<span class="token punctuation">,</span> <span class="token string">'proportion'</span><span class="token operator">=</span><span class="token string">'0.1'</span><span class="token punctuation">,</span> <span class="token string">'type'</span><span class="token operator">=</span><span class="token string">'stendis'</span><span class="token punctuation">,</span> <span class="token string">'number'</span><span class="token operator">=</span><span class="token string">'2'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> outlier_stendis_sample<span class="token punctuation">,</span> equal_size_bucket_outlier_sample<span class="token punctuation">(</span>temperature<span class="token punctuation">,</span> <span class="token string">'proportion'</span><span class="token operator">=</span><span class="token string">'0.1'</span><span class="token punctuation">,</span> <span class="token string">'type'</span><span class="token operator">=</span><span class="token string">'cos'</span><span class="token punctuation">,</span> <span class="token string">'number'</span><span class="token operator">=</span><span class="token string">'2'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> outlier_cos_sample<span class="token punctuation">,</span> equal_size_bucket_outlier_sample<span class="token punctuation">(</span>temperature<span class="token punctuation">,</span> <span class="token string">'proportion'</span><span class="token operator">=</span><span class="token string">'0.1'</span><span class="token punctuation">,</span> <span class="token string">'type'</span><span class="token operator">=</span><span class="token string">'prenextdis'</span><span class="token punctuation">,</span> <span class="token string">'number'</span><span class="token operator">=</span><span class="token string">'2'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> outlier_prenextdis_sample <span class="token keyword">from</span> root<span class="token punctuation">.</span>ln<span class="token punctuation">.</span>wf01<span class="token punctuation">.</span>wt01<span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>结果:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------+----------------------+------------------+-------------------------+ |
| | Time|outlier_avg_sample|outlier_stendis_sample|outlier_cos_sample|outlier_prenextdis_sample| |
| +-----------------------------+------------------+----------------------+------------------+-------------------------+ |
| |1970-01-01T08:00:00.005+08:00| 105.0| 105.0| 105.0| 105.0| |
| |1970-01-01T08:00:00.015+08:00| 115.0| 115.0| 115.0| 115.0| |
| |1970-01-01T08:00:00.025+08:00| 125.0| 125.0| 125.0| 125.0| |
| |1970-01-01T08:00:00.035+08:00| 135.0| 135.0| 135.0| 135.0| |
| |1970-01-01T08:00:00.045+08:00| 145.0| 145.0| 145.0| 145.0| |
| |1970-01-01T08:00:00.055+08:00| 155.0| 155.0| 155.0| 155.0| |
| |1970-01-01T08:00:00.065+08:00| 165.0| 165.0| 165.0| 165.0| |
| |1970-01-01T08:00:00.075+08:00| 175.0| 175.0| 175.0| 175.0| |
| |1970-01-01T08:00:00.085+08:00| 185.0| 185.0| 185.0| 185.0| |
| |1970-01-01T08:00:00.095+08:00| 195.0| 195.0| 195.0| 195.0| |
| +-----------------------------+------------------+----------------------+------------------+-------------------------+ |
| Total line number = 10 |
| It costs 0.041s |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="m4函数" tabindex="-1"><a class="header-anchor" href="#m4函数" aria-hidden="true">#</a> M4函数</h4><h5 id="函数简介-5" tabindex="-1"><a class="header-anchor" href="#函数简介-5" aria-hidden="true">#</a> 函数简介</h5><p>M4用于在窗口内采样第一个点(<code>first</code>)、最后一个点(<code>last</code>)、最小值点(<code>bottom</code>)、最大值点(<code>top</code>):</p><ul><li>第一个点是拥有这个窗口内最小时间戳的点;</li><li>最后一个点是拥有这个窗口内最大时间戳的点;</li><li>最小值点是拥有这个窗口内最小值的点(如果有多个这样的点,M4只返回其中一个);</li><li>最大值点是拥有这个窗口内最大值的点(如果有多个这样的点,M4只返回其中一个)。</li></ul><img src="https://alioss.timecho.com/docs/img/github/198178733-a0919d17-0663-4672-9c4f-1efad6f463c2.png" alt="image" style="zoom:50%;"><table><thead><tr><th>函数名</th><th>可接收的输入序列类型</th><th>属性参数</th><th>输出序列类型</th><th>功能类型</th></tr></thead><tbody><tr><td>M4</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>包含固定点数的窗口和滑动时间窗口使用不同的属性参数。包含固定点数的窗口使用属性<code>windowSize</code>和<code>slidingStep</code>。滑动时间窗口使用属性<code>timeInterval</code>、<code>slidingStep</code>、<code>displayWindowBegin</code>和<code>displayWindowEnd</code>。更多细节见下文。</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>返回每个窗口内的第一个点(<code>first</code>)、最后一个点(<code>last</code>)、最小值点(<code>bottom</code>)、最大值点(<code>top</code>)。在一个窗口内的聚合点输出之前,M4会将它们按照时间戳递增排序并且去重。</td></tr></tbody></table><h5 id="属性参数" tabindex="-1"><a class="header-anchor" href="#属性参数" aria-hidden="true">#</a> 属性参数</h5><p><strong>(1) 包含固定点数的窗口(SlidingSizeWindowAccessStrategy)使用的属性参数:</strong></p><ul><li><code>windowSize</code>: 一个窗口内的点数。Int数据类型。必需的属性参数。</li><li><code>slidingStep</code>: 按照设定的点数来滑动窗口。Int数据类型。可选的属性参数;如果没有设置,默认取值和<code>windowSize</code>一样。</li></ul><img src="https://alioss.timecho.com/docs/img/github/198181449-00d563c8-7bce-4ecd-a031-ec120ca42c3f.png" alt="image" style="zoom:50%;"><p><strong>(2) 滑动时间窗口(SlidingTimeWindowAccessStrategy)使用的属性参数:</strong></p><ul><li><code>timeInterval</code>: 一个窗口的时间长度。Long数据类型。必需的属性参数。</li><li><code>slidingStep</code>: 按照设定的时长来滑动窗口。Long数据类型。可选的属性参数;如果没有设置,默认取值和<code>timeInterval</code>一样。</li><li><code>displayWindowBegin</code>: 窗口滑动的起始时间戳位置(包含在内)。Long数据类型。可选的属性参数;如果没有设置,默认取值为Long.MIN_VALUE,意为使用输入的时间序列的第一个点的时间戳作为窗口滑动的起始时间戳位置。</li><li><code>displayWindowEnd</code>: 结束时间限制(不包含在内;本质上和<code>WHERE time < displayWindowEnd</code>起的效果是一样的)。Long数据类型。可选的属性参数;如果没有设置,默认取值为Long.MAX_VALUE,意为除了输入的时间序列自身数据读取完毕之外没有增加额外的结束时间过滤条件限制。</li></ul><img src="https://alioss.timecho.com/docs/img/github/198183015-93b56644-3330-4acf-ae9e-d718a02b5f4c.png" alt="groupBy window" style="zoom:67%;"><h5 id="使用示例-10" tabindex="-1"><a class="header-anchor" href="#使用示例-10" aria-hidden="true">#</a> 使用示例</h5><p>输入的时间序列:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token operator">+</span><span class="token comment">-----------------------------+------------------+</span> |
| <span class="token operator">|</span> <span class="token keyword">Time</span><span class="token operator">|</span>root<span class="token punctuation">.</span>vehicle<span class="token punctuation">.</span>d1<span class="token punctuation">.</span>s1<span class="token operator">|</span> |
| <span class="token operator">+</span><span class="token comment">-----------------------------+------------------+</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.001</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">5.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.002</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">15.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.005</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">10.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.008</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">8.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.010</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">30.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.020</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">20.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.025</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">8.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.027</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">20.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.030</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">40.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.033</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">9.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.035</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">10.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.040</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">20.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.045</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">30.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.052</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">8.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.054</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">18.0</span><span class="token operator">|</span> |
| <span class="token operator">+</span><span class="token comment">-----------------------------+------------------+</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>查询语句1:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> M4<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'timeInterval'</span><span class="token operator">=</span><span class="token string">'25'</span><span class="token punctuation">,</span><span class="token string">'displayWindowBegin'</span><span class="token operator">=</span><span class="token string">'0'</span><span class="token punctuation">,</span><span class="token string">'displayWindowEnd'</span><span class="token operator">=</span><span class="token string">'100'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>vehicle<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出结果1:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token operator">+</span><span class="token comment">-----------------------------+-----------------------------------------------------------------------------------------------+</span> |
| <span class="token operator">|</span> <span class="token keyword">Time</span><span class="token operator">|</span>M4<span class="token punctuation">(</span>root<span class="token punctuation">.</span>vehicle<span class="token punctuation">.</span>d1<span class="token punctuation">.</span>s1<span class="token punctuation">,</span> <span class="token string">"timeInterval"</span><span class="token operator">=</span><span class="token string">"25"</span><span class="token punctuation">,</span> <span class="token string">"displayWindowBegin"</span><span class="token operator">=</span><span class="token string">"0"</span><span class="token punctuation">,</span> <span class="token string">"displayWindowEnd"</span><span class="token operator">=</span><span class="token string">"100"</span><span class="token punctuation">)</span><span class="token operator">|</span> |
| <span class="token operator">+</span><span class="token comment">-----------------------------+-----------------------------------------------------------------------------------------------+</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.001</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">5.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.010</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">30.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.020</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">20.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.025</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">8.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.030</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">40.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.045</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">30.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.052</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">8.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.054</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">18.0</span><span class="token operator">|</span> |
| <span class="token operator">+</span><span class="token comment">-----------------------------+-----------------------------------------------------------------------------------------------+</span> |
| Total line number <span class="token operator">=</span> <span class="token number">8</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>查询语句2:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> M4<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'windowSize'</span><span class="token operator">=</span><span class="token string">'10'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>vehicle<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出结果2:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token operator">+</span><span class="token comment">-----------------------------+-----------------------------------------+</span> |
| <span class="token operator">|</span> <span class="token keyword">Time</span><span class="token operator">|</span>M4<span class="token punctuation">(</span>root<span class="token punctuation">.</span>vehicle<span class="token punctuation">.</span>d1<span class="token punctuation">.</span>s1<span class="token punctuation">,</span> <span class="token string">"windowSize"</span><span class="token operator">=</span><span class="token string">"10"</span><span class="token punctuation">)</span><span class="token operator">|</span> |
| <span class="token operator">+</span><span class="token comment">-----------------------------+-----------------------------------------+</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.001</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">5.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.030</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">40.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.033</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">9.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.035</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">10.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.045</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">30.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.052</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">8.0</span><span class="token operator">|</span> |
| <span class="token operator">|</span><span class="token number">1970</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span>T08:<span class="token number">00</span>:<span class="token number">00.054</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token operator">|</span> <span class="token number">18.0</span><span class="token operator">|</span> |
| <span class="token operator">+</span><span class="token comment">-----------------------------+-----------------------------------------+</span> |
| Total line number <span class="token operator">=</span> <span class="token number">7</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5 id="推荐的使用场景" tabindex="-1"><a class="header-anchor" href="#推荐的使用场景" aria-hidden="true">#</a> 推荐的使用场景</h5><p><strong>(1) 使用场景:保留极端点的降采样</strong></p><p>由于M4为每个窗口聚合其第一个点(<code>first</code>)、最后一个点(<code>last</code>)、最小值点(<code>bottom</code>)、最大值点(<code>top</code>),因此M4通常保留了极值点,因此比其他下采样方法(如分段聚合近似 (PAA))能更好地保留模式。如果你想对时间序列进行下采样并且希望保留极值点,你可以试试 M4。</p><p><strong>(2) 使用场景:基于M4降采样的大规模时间序列的零误差双色折线图可视化</strong></p><p>参考论文<a href="http://www.vldb.org/pvldb/vol7/p797-jugel.pdf" target="_blank" rel="noopener noreferrer">"M4: A Visualization-Oriented Time Series Data Aggregation"<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a>,作为大规模时间序列可视化的降采样方法,M4可以做到双色折线图的零变形。</p><p>假设屏幕画布的像素宽乘高是<code>w*h</code>,假设时间序列要可视化的时间范围是<code>[tqs,tqe)</code>,并且(tqe-tqs)是w的整数倍,那么落在第i个时间跨度<code>Ii=[tqs+(tqe-tqs)/w*(i-1),tqs+(tqe-tqs)/w*i)</code> 内的点将会被画在第i个像素列中,i=1,2,...,w。于是从可视化驱动的角度出发,使用查询语句:<code>"select M4(s1,'timeInterval'='(tqe-tqs)/w','displayWindowBegin'='tqs','displayWindowEnd'='tqe') from root.vehicle.d1"</code>,来采集每个时间跨度内的第一个点(<code>first</code>)、最后一个点(<code>last</code>)、最小值点(<code>bottom</code>)、最大值点(<code>top</code>)。降采样时间序列的结果点数不会超过<code>4*w</code>个,与此同时,使用这些聚合点画出来的二色折线图与使用原始数据画出来的在像素级别上是完全一致的。</p><p>为了免除参数值硬编码的麻烦,当Grafana用于可视化时,我们推荐使用Grafana的<a href="https://grafana.com/docs/grafana/latest/dashboards/variables/add-template-variables/#global-variables" target="_blank" rel="noopener noreferrer">模板变量<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a><code>$ __interval_ms</code>,如下所示:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> M4<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'timeInterval'</span><span class="token operator">=</span><span class="token string">'$__interval_ms'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>其中<code>timeInterval</code>自动设置为<code>(tqe-tqs)/w</code>。请注意,这里的时间精度假定为毫秒。</p><h5 id="和其它函数的功能比较" tabindex="-1"><a class="header-anchor" href="#和其它函数的功能比较" aria-hidden="true">#</a> 和其它函数的功能比较</h5><table><thead><tr><th>SQL</th><th>是否支持M4聚合</th><th>滑动窗口类型</th><th>示例</th><th>相关文档</th></tr></thead><tbody><tr><td>1. 带有Group By子句的内置聚合函数</td><td>不支持,缺少<code>BOTTOM_TIME</code>和<code>TOP_TIME</code>,即缺少最小值点和最大值点的时间戳。</td><td>Time Window</td><td><code>select count(status), max_value(temperature) from root.ln.wf01.wt01 group by ([2017-11-01 00:00:00, 2017-11-07 23:00:00), 3h, 1d)</code></td><td><a href="https://iotdb.apache.org/UserGuide/Master/Query-Data/Aggregate-Query.html#built-in-aggregate-functions" target="_blank" rel="noopener noreferrer">https://iotdb.apache.org/UserGuide/Master/Query-Data/Aggregate-Query.html#built-in-aggregate-functions<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a> <br><a href="https://iotdb.apache.org/UserGuide/Master/Query-Data/Aggregate-Query.html#downsampling-aggregate-query" target="_blank" rel="noopener noreferrer">https://iotdb.apache.org/UserGuide/Master/Query-Data/Aggregate-Query.html#downsampling-aggregate-query<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a></td></tr><tr><td>2. EQUAL_SIZE_BUCKET_M4_SAMPLE (内置UDF)</td><td>支持*</td><td>Size Window. <code>windowSize = 4*(int)(1/proportion)</code></td><td><code>select equal_size_bucket_m4_sample(temperature, 'proportion'='0.1') as M4_sample from root.ln.wf01.wt01</code></td><td><a href="https://iotdb.apache.org/UserGuide/Master/Query-Data/Select-Expression.html#time-series-generating-functions" target="_blank" rel="noopener noreferrer">https://iotdb.apache.org/UserGuide/Master/Query-Data/Select-Expression.html#time-series-generating-functions<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a></td></tr><tr><td><strong>3. M4 (内置UDF)</strong></td><td>支持*</td><td>Size Window, Time Window</td><td>(1) Size Window: <code>select M4(s1,'windowSize'='10') from root.vehicle.d1</code> <br>(2) Time Window: <code>select M4(s1,'timeInterval'='25','displayWindowBegin'='0','displayWindowEnd'='100') from root.vehicle.d1</code></td><td>本文档</td></tr><tr><td>4. 扩展带有Group By子句的内置聚合函数来支持M4聚合</td><td>未实施</td><td>未实施</td><td>未实施</td><td>未实施</td></tr></tbody></table><p>进一步比较<code>EQUAL_SIZE_BUCKET_M4_SAMPLE</code>和<code>M4</code>:</p><p><strong>(1) 不同的M4聚合函数定义:</strong></p><p>在每个窗口内,<code>EQUAL_SIZE_BUCKET_M4_SAMPLE</code>从排除了第一个点和最后一个点之后剩余的点中提取最小值点和最大值点。</p><p>而<code>M4</code>则是从窗口内所有点中(包括第一个点和最后一个点)提取最小值点和最大值点,这个定义与元数据中保存的<code>max_value</code>和<code>min_value</code>的语义更加一致。</p><p>值得注意的是,在一个窗口内的聚合点输出之前,<code>EQUAL_SIZE_BUCKET_M4_SAMPLE</code>和<code>M4</code>都会将它们按照时间戳递增排序并且去重。</p><p><strong>(2) 不同的滑动窗口:</strong></p><p><code>EQUAL_SIZE_BUCKET_M4_SAMPLE</code>使用SlidingSizeWindowAccessStrategy,并且通过采样比例(<code>proportion</code>)来间接控制窗口点数(<code>windowSize</code>),转换公式是<code>windowSize = 4*(int)(1/proportion)</code>。</p><p><code>M4</code>支持两种滑动窗口:SlidingSizeWindowAccessStrategy和SlidingTimeWindowAccessStrategy,并且<code>M4</code>通过相应的参数直接控制窗口的点数或者时长。</p><h3 id="选择函数" tabindex="-1"><a class="header-anchor" href="#选择函数" aria-hidden="true">#</a> 选择函数</h3><p>目前 IoTDB 支持如下选择函数:</p><table><thead><tr><th>函数名</th><th>输入序列类型</th><th>必要的属性参数</th><th>输出序列类型</th><th>功能描述</th></tr></thead><tbody><tr><td>TOP_K</td><td>INT32 / INT64 / FLOAT / DOUBLE / TEXT</td><td><code>k</code>: 最多选择的数据点数,必须大于 0 小于等于 1000</td><td>与输入序列的实际类型一致</td><td>返回某时间序列中值最大的<code>k</code>个数据点。若多于<code>k</code>个数据点的值并列最大,则返回时间戳最小的数据点。</td></tr><tr><td>BOTTOM_K</td><td>INT32 / INT64 / FLOAT / DOUBLE / TEXT</td><td><code>k</code>: 最多选择的数据点数,必须大于 0 小于等于 1000</td><td>与输入序列的实际类型一致</td><td>返回某时间序列中值最小的<code>k</code>个数据点。若多于<code>k</code>个数据点的值并列最小,则返回时间戳最小的数据点。</td></tr></tbody></table><p>例如:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> s1<span class="token punctuation">,</span> top_k<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">'k'</span><span class="token operator">=</span><span class="token string">'2'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> bottom_k<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">'k'</span><span class="token operator">=</span><span class="token string">'2'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">.</span>d2 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator">></span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">12</span><span class="token operator">-</span><span class="token number">10</span>T20:<span class="token number">36</span>:<span class="token number">15.530</span><span class="token operator">+</span><span class="token number">08</span>:<span class="token number">00</span><span class="token punctuation">;</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>结果:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------+------------------------------+---------------------------------+ |
| | Time| root.sg1.d2.s1|top_k(root.sg1.d2.s1, "k"="2")|bottom_k(root.sg1.d2.s1, "k"="2")| |
| +-----------------------------+--------------------+------------------------------+---------------------------------+ |
| |2020-12-10T20:36:15.531+08:00| 1531604122307244742| 1531604122307244742| null| |
| |2020-12-10T20:36:15.532+08:00|-7426070874923281101| null| null| |
| |2020-12-10T20:36:15.533+08:00|-7162825364312197604| -7162825364312197604| null| |
| |2020-12-10T20:36:15.534+08:00|-8581625725655917595| null| -8581625725655917595| |
| |2020-12-10T20:36:15.535+08:00|-7667364751255535391| null| -7667364751255535391| |
| +-----------------------------+--------------------+------------------------------+---------------------------------+ |
| Total line number = 5 |
| It costs 0.006s |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="数据画像" tabindex="-1"><a class="header-anchor" href="#数据画像" aria-hidden="true">#</a> 数据画像</h3><h4 id="acf" tabindex="-1"><a class="header-anchor" href="#acf" aria-hidden="true">#</a> ACF</h4><h5 id="函数简介-6" tabindex="-1"><a class="header-anchor" href="#函数简介-6" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算时间序列的自相关函数值,即序列与自身之间的互相关函数,详情参见<a href="/zh/UserGuide/V1.2.x/User-Manuel/Data-Matching.html#XCorr" class="">XCorr</a>函数文档。</p><p><strong>函数名:</strong> ACF</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE。序列中共包含<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mi>N</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2N-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>个数据点,每个值的具体含义参见<a href="/zh/UserGuide/V1.2.x/User-Manuel/Data-Matching.html#XCorr" class="">XCorr</a>函数文档。</p><p><strong>提示:</strong></p><ul><li>序列中的<code>NaN</code>值会被忽略,在计算中表现为0。</li></ul><h5 id="使用示例-11" tabindex="-1"><a class="header-anchor" href="#使用示例-11" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:01.000+08:00| 1| |
| |2020-01-01T00:00:02.000+08:00| NaN| |
| |2020-01-01T00:00:03.000+08:00| 3| |
| |2020-01-01T00:00:04.000+08:00| NaN| |
| |2020-01-01T00:00:05.000+08:00| 5| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> acf<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">00</span>:<span class="token number">05</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------+ |
| | Time|acf(root.test.d1.s1)| |
| +-----------------------------+--------------------+ |
| |1970-01-01T08:00:00.001+08:00| 1.0| |
| |1970-01-01T08:00:00.002+08:00| 0.0| |
| |1970-01-01T08:00:00.003+08:00| 3.6| |
| |1970-01-01T08:00:00.004+08:00| 0.0| |
| |1970-01-01T08:00:00.005+08:00| 7.0| |
| |1970-01-01T08:00:00.006+08:00| 0.0| |
| |1970-01-01T08:00:00.007+08:00| 3.6| |
| |1970-01-01T08:00:00.008+08:00| 0.0| |
| |1970-01-01T08:00:00.009+08:00| 1.0| |
| +-----------------------------+--------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="distinct" tabindex="-1"><a class="header-anchor" href="#distinct" aria-hidden="true">#</a> Distinct</h4><h5 id="函数简介-7" tabindex="-1"><a class="header-anchor" href="#函数简介-7" aria-hidden="true">#</a> 函数简介</h5><p>本函数可以返回输入序列中出现的所有不同的元素。</p><p><strong>函数名:</strong> DISTINCT</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型可以是任意的</p><p><strong>输出序列:</strong> 输出单个序列,类型与输入相同。</p><p><strong>提示:</strong></p><ul><li>输出序列的时间戳是无意义的。输出顺序是任意的。</li><li>缺失值和空值将被忽略,但<code>NaN</code>不会被忽略。</li><li>字符串区分大小写</li></ul><h5 id="使用示例-12" tabindex="-1"><a class="header-anchor" href="#使用示例-12" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d2.s2| |
| +-----------------------------+---------------+ |
| |2020-01-01T08:00:00.001+08:00| Hello| |
| |2020-01-01T08:00:00.002+08:00| hello| |
| |2020-01-01T08:00:00.003+08:00| Hello| |
| |2020-01-01T08:00:00.004+08:00| World| |
| |2020-01-01T08:00:00.005+08:00| World| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> <span class="token keyword">distinct</span><span class="token punctuation">(</span>s2<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------+ |
| | Time|distinct(root.test.d2.s2)| |
| +-----------------------------+-------------------------+ |
| |1970-01-01T08:00:00.001+08:00| Hello| |
| |1970-01-01T08:00:00.002+08:00| hello| |
| |1970-01-01T08:00:00.003+08:00| World| |
| +-----------------------------+-------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="histogram" tabindex="-1"><a class="header-anchor" href="#histogram" aria-hidden="true">#</a> Histogram</h4><h5 id="函数简介-8" tabindex="-1"><a class="header-anchor" href="#函数简介-8" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算单列数值型数据的分布直方图。</p><p><strong>函数名:</strong> HISTOGRAM</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>min</code>:表示所求数据范围的下限,默认值为 -Double.MAX_VALUE。</li><li><code>max</code>:表示所求数据范围的上限,默认值为 Double.MAX_VALUE,<code>start</code>的值必须小于或等于<code>end</code>。</li><li><code>count</code>: 表示直方图分桶的数量,默认值为 1,其值必须为正整数。</li></ul><p><strong>输出序列:</strong> 直方图分桶的值,其中第 i 个桶(从 1 开始计数)表示的数据范围下界为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mi>i</mi><mi>n</mi><mo>+</mo><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mo>⋅</mo><mfrac><mrow><mi>m</mi><mi>a</mi><mi>x</mi><mo>−</mo><mi>m</mi><mi>i</mi><mi>n</mi></mrow><mrow><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">min+ (i-1)\cdot\frac{max-min}{count}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7429em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">min</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.2007em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8557em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">co</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">n</span><span class="mord mathnormal mtight">t</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ma</span><span class="mord mathnormal mtight">x</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">min</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>,数据范围上界为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mi>i</mi><mi>n</mi><mo>+</mo><mi>i</mi><mo>⋅</mo><mfrac><mrow><mi>m</mi><mi>a</mi><mi>x</mi><mo>−</mo><mi>m</mi><mi>i</mi><mi>n</mi></mrow><mrow><mi>c</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">min+ i \cdot \frac{max-min}{count}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7429em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">min</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6595em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.2007em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8557em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">co</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">n</span><span class="mord mathnormal mtight">t</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ma</span><span class="mord mathnormal mtight">x</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">min</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>。</p><p><strong>提示:</strong></p><ul><li>如果某个数据点的数值小于<code>min</code>,它会被放入第 1 个桶;如果某个数据点的数值大于<code>max</code>,它会被放入最后 1 个桶。</li><li>数据中的空值、缺失值和<code>NaN</code>将会被忽略。</li></ul><h5 id="使用示例-13" tabindex="-1"><a class="header-anchor" href="#使用示例-13" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:00.000+08:00| 1.0| |
| |2020-01-01T00:00:01.000+08:00| 2.0| |
| |2020-01-01T00:00:02.000+08:00| 3.0| |
| |2020-01-01T00:00:03.000+08:00| 4.0| |
| |2020-01-01T00:00:04.000+08:00| 5.0| |
| |2020-01-01T00:00:05.000+08:00| 6.0| |
| |2020-01-01T00:00:06.000+08:00| 7.0| |
| |2020-01-01T00:00:07.000+08:00| 8.0| |
| |2020-01-01T00:00:08.000+08:00| 9.0| |
| |2020-01-01T00:00:09.000+08:00| 10.0| |
| |2020-01-01T00:00:10.000+08:00| 11.0| |
| |2020-01-01T00:00:11.000+08:00| 12.0| |
| |2020-01-01T00:00:12.000+08:00| 13.0| |
| |2020-01-01T00:00:13.000+08:00| 14.0| |
| |2020-01-01T00:00:14.000+08:00| 15.0| |
| |2020-01-01T00:00:15.000+08:00| 16.0| |
| |2020-01-01T00:00:16.000+08:00| 17.0| |
| |2020-01-01T00:00:17.000+08:00| 18.0| |
| |2020-01-01T00:00:18.000+08:00| 19.0| |
| |2020-01-01T00:00:19.000+08:00| 20.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> histogram<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">"min"</span><span class="token operator">=</span><span class="token string">"1"</span><span class="token punctuation">,</span><span class="token string">"max"</span><span class="token operator">=</span><span class="token string">"20"</span><span class="token punctuation">,</span><span class="token string">"count"</span><span class="token operator">=</span><span class="token string">"10"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------------------------------------------------------+ |
| | Time|histogram(root.test.d1.s1, "min"="1", "max"="20", "count"="10")| |
| +-----------------------------+---------------------------------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 2| |
| |1970-01-01T08:00:00.001+08:00| 2| |
| |1970-01-01T08:00:00.002+08:00| 2| |
| |1970-01-01T08:00:00.003+08:00| 2| |
| |1970-01-01T08:00:00.004+08:00| 2| |
| |1970-01-01T08:00:00.005+08:00| 2| |
| |1970-01-01T08:00:00.006+08:00| 2| |
| |1970-01-01T08:00:00.007+08:00| 2| |
| |1970-01-01T08:00:00.008+08:00| 2| |
| |1970-01-01T08:00:00.009+08:00| 2| |
| +-----------------------------+---------------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="integral" tabindex="-1"><a class="header-anchor" href="#integral" aria-hidden="true">#</a> Integral</h4><h5 id="函数简介-9" tabindex="-1"><a class="header-anchor" href="#函数简介-9" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算时间序列的数值积分,即以时间为横坐标、数值为纵坐标绘制的折线图中折线以下的面积。</p><p><strong>函数名:</strong> INTEGRAL</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>unit</code>:积分求解所用的时间轴单位,取值为 "1S", "1s", "1m", "1H", "1d"(区分大小写),分别表示以毫秒、秒、分钟、小时、天为单位计算积分。<br> 缺省情况下取 "1s",以秒为单位。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE,序列仅包含一个时间戳为 0、值为积分结果的数据点。</p><p><strong>提示:</strong></p><ul><li><p>积分值等于折线图中每相邻两个数据点和时间轴形成的直角梯形的面积之和,不同时间单位下相当于横轴进行不同倍数放缩,得到的积分值可直接按放缩倍数转换。</p></li><li><p>数据中<code>NaN</code>将会被忽略。折线将以临近两个有值数据点为准。</p></li></ul><h5 id="使用示例-14" tabindex="-1"><a class="header-anchor" href="#使用示例-14" aria-hidden="true">#</a> 使用示例</h5><h6 id="参数缺省-4" tabindex="-1"><a class="header-anchor" href="#参数缺省-4" aria-hidden="true">#</a> 参数缺省</h6><p>缺省情况下积分以1s为时间单位。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:01.000+08:00| 1| |
| |2020-01-01T00:00:02.000+08:00| 2| |
| |2020-01-01T00:00:03.000+08:00| 5| |
| |2020-01-01T00:00:04.000+08:00| 6| |
| |2020-01-01T00:00:05.000+08:00| 7| |
| |2020-01-01T00:00:08.000+08:00| 8| |
| |2020-01-01T00:00:09.000+08:00| NaN| |
| |2020-01-01T00:00:10.000+08:00| 10| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> integral<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">00</span>:<span class="token number">10</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------+ |
| | Time|integral(root.test.d1.s1)| |
| +-----------------------------+-------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 57.5| |
| +-----------------------------+-------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>其计算公式为:</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mn>1</mn><mn>2</mn></mfrac><mo stretchy="false">[</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mn>2</mn><mo stretchy="false">)</mo><mo>×</mo><mn>1</mn><mo>+</mo><mo stretchy="false">(</mo><mn>2</mn><mo>+</mo><mn>5</mn><mo stretchy="false">)</mo><mo>×</mo><mn>1</mn><mo>+</mo><mo stretchy="false">(</mo><mn>5</mn><mo>+</mo><mn>6</mn><mo stretchy="false">)</mo><mo>×</mo><mn>1</mn><mo>+</mo><mo stretchy="false">(</mo><mn>6</mn><mo>+</mo><mn>7</mn><mo stretchy="false">)</mo><mo>×</mo><mn>1</mn><mo>+</mo><mo stretchy="false">(</mo><mn>7</mn><mo>+</mo><mn>8</mn><mo stretchy="false">)</mo><mo>×</mo><mn>3</mn><mo>+</mo><mo stretchy="false">(</mo><mn>8</mn><mo>+</mo><mn>10</mn><mo stretchy="false">)</mo><mo>×</mo><mn>2</mn><mo stretchy="false">]</mo><mo>=</mo><mn>57.5</mn></mrow><annotation encoding="application/x-tex"> \frac{1}{2}[(1+2)\times 1 + (2+5) \times 1 + (5+6) \times 1 + (6+7) \times 1 + (7+8) \times 3 + (8+10) \times 2] = 57.5 </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">[(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">5</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">6</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">6</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">7</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">7</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">8</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">8</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">10</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">57.5</span></span></span></span></span></p><h5 id="指定时间单位" tabindex="-1"><a class="header-anchor" href="#指定时间单位" aria-hidden="true">#</a> 指定时间单位</h5><p>指定以分钟为时间单位。</p><p>输入序列同上,用于查询的 SQL 语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> integral<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">"unit"</span><span class="token operator">=</span><span class="token string">"1m"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">00</span>:<span class="token number">10</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------+ |
| | Time|integral(root.test.d1.s1)| |
| +-----------------------------+-------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.958| |
| +-----------------------------+-------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>其计算公式为:</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mn>1</mn><mrow><mn>2</mn><mo>×</mo><mn>60</mn></mrow></mfrac><mo stretchy="false">[</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mn>2</mn><mo stretchy="false">)</mo><mo>×</mo><mn>1</mn><mo>+</mo><mo stretchy="false">(</mo><mn>2</mn><mo>+</mo><mn>3</mn><mo stretchy="false">)</mo><mo>×</mo><mn>1</mn><mo>+</mo><mo stretchy="false">(</mo><mn>5</mn><mo>+</mo><mn>6</mn><mo stretchy="false">)</mo><mo>×</mo><mn>1</mn><mo>+</mo><mo stretchy="false">(</mo><mn>6</mn><mo>+</mo><mn>7</mn><mo stretchy="false">)</mo><mo>×</mo><mn>1</mn><mo>+</mo><mo stretchy="false">(</mo><mn>7</mn><mo>+</mo><mn>8</mn><mo stretchy="false">)</mo><mo>×</mo><mn>3</mn><mo>+</mo><mo stretchy="false">(</mo><mn>8</mn><mo>+</mo><mn>10</mn><mo stretchy="false">)</mo><mo>×</mo><mn>2</mn><mo stretchy="false">]</mo><mo>=</mo><mn>0.958</mn></mrow><annotation encoding="application/x-tex"> \frac{1}{2\times 60}[(1+2) \times 1 + (2+3) \times 1 + (5+6) \times 1 + (6+7) \times 1 + (7+8) \times 3 + (8+10) \times 2] = 0.958 </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">60</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">[(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">3</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">6</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">6</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">7</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">7</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">8</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">8</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">10</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.958</span></span></span></span></span></p><h4 id="integralavg" tabindex="-1"><a class="header-anchor" href="#integralavg" aria-hidden="true">#</a> IntegralAvg</h4><h5 id="函数简介-10" tabindex="-1"><a class="header-anchor" href="#函数简介-10" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算时间序列的函数均值,即在相同时间单位下的数值积分除以序列总的时间跨度。更多关于数值积分计算的信息请参考<code>Integral</code>函数。</p><p><strong>函数名:</strong> INTEGRALAVG</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE,序列仅包含一个时间戳为 0、值为时间加权平均结果的数据点。</p><p><strong>提示:</strong></p><ul><li><p>时间加权的平均值等于在任意时间单位<code>unit</code>下计算的数值积分(即折线图中每相邻两个数据点和时间轴形成的直角梯形的面积之和),<br> 除以相同时间单位下输入序列的时间跨度,其值与具体采用的时间单位无关,默认与 IoTDB 时间单位一致。</p></li><li><p>数据中的<code>NaN</code>将会被忽略。折线将以临近两个有值数据点为准。</p></li><li><p>输入序列为空时,函数输出结果为 0;仅有一个数据点时,输出结果为该点数值。</p></li></ul><h5 id="使用示例-15" tabindex="-1"><a class="header-anchor" href="#使用示例-15" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:01.000+08:00| 1| |
| |2020-01-01T00:00:02.000+08:00| 2| |
| |2020-01-01T00:00:03.000+08:00| 5| |
| |2020-01-01T00:00:04.000+08:00| 6| |
| |2020-01-01T00:00:05.000+08:00| 7| |
| |2020-01-01T00:00:08.000+08:00| 8| |
| |2020-01-01T00:00:09.000+08:00| NaN| |
| |2020-01-01T00:00:10.000+08:00| 10| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> integralavg<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">00</span>:<span class="token number">10</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+----------------------------+ |
| | Time|integralavg(root.test.d1.s1)| |
| +-----------------------------+----------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 5.75| |
| +-----------------------------+----------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>其计算公式为:</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mn>1</mn><mn>2</mn></mfrac><mo stretchy="false">[</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><mn>2</mn><mo stretchy="false">)</mo><mo>×</mo><mn>1</mn><mo>+</mo><mo stretchy="false">(</mo><mn>2</mn><mo>+</mo><mn>5</mn><mo stretchy="false">)</mo><mo>×</mo><mn>1</mn><mo>+</mo><mo stretchy="false">(</mo><mn>5</mn><mo>+</mo><mn>6</mn><mo stretchy="false">)</mo><mo>×</mo><mn>1</mn><mo>+</mo><mo stretchy="false">(</mo><mn>6</mn><mo>+</mo><mn>7</mn><mo stretchy="false">)</mo><mo>×</mo><mn>1</mn><mo>+</mo><mo stretchy="false">(</mo><mn>7</mn><mo>+</mo><mn>8</mn><mo stretchy="false">)</mo><mo>×</mo><mn>3</mn><mo>+</mo><mo stretchy="false">(</mo><mn>8</mn><mo>+</mo><mn>10</mn><mo stretchy="false">)</mo><mo>×</mo><mn>2</mn><mo stretchy="false">]</mo><mi mathvariant="normal">/</mi><mn>10</mn><mo>=</mo><mn>5.75</mn></mrow><annotation encoding="application/x-tex"> \frac{1}{2}[(1+2)\times 1 + (2+5) \times 1 + (5+6) \times 1 + (6+7) \times 1 + (7+8) \times 3 + (8+10) \times 2] / 10 = 5.75 </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">[(</span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">5</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">6</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">6</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">7</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">7</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">8</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">8</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">10</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">]</span><span class="mord">/10</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5.75</span></span></span></span></span></p><h4 id="mad" tabindex="-1"><a class="header-anchor" href="#mad" aria-hidden="true">#</a> Mad</h4><h5 id="函数简介-11" tabindex="-1"><a class="header-anchor" href="#函数简介-11" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算单列数值型数据的精确或近似绝对中位差,绝对中位差为所有数值与其中位数绝对偏移量的中位数。</p><p>如有数据集<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mn>1</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>5</mn><mo separator="true">,</mo><mn>5</mn><mo separator="true">,</mo><mn>6</mn><mo separator="true">,</mo><mn>7</mn><mo separator="true">,</mo><mn>8</mn><mo separator="true">,</mo><mn>9</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{1,3,3,5,5,6,7,8,9\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">6</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">7</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">8</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">9</span><span class="mclose">}</span></span></span></span>,其中位数为5,所有数值与中位数的偏移量的绝对值为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mn>0</mn><mo separator="true">,</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>4</mn><mo separator="true">,</mo><mn>4</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{0,0,1,2,2,2,3,4,4\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mclose">}</span></span></span></span>,其中位数为2,故而原数据集的绝对中位差为2。</p><p><strong>函数名:</strong> MAD</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>error</code>:近似绝对中位差的基于数值的误差百分比,取值范围为 [0,1),默认值为 0。如当<code>error</code>=0.01 时,记精确绝对中位差为a,近似绝对中位差为b,不等式 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0.99</mn><mi>a</mi><mo>≤</mo><mi>b</mi><mo>≤</mo><mn>1.01</mn><mi>a</mi></mrow><annotation encoding="application/x-tex">0.99a \le b \le 1.01a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7804em;vertical-align:-0.136em;"></span><span class="mord">0.99</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8304em;vertical-align:-0.136em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1.01</span><span class="mord mathnormal">a</span></span></span></span> 成立。当<code>error</code>=0 时,计算结果为精确绝对中位差。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为DOUBLE,序列仅包含一个时间戳为 0、值为绝对中位差的数据点。</p><p><strong>提示:</strong> 数据中的空值、缺失值和<code>NaN</code>将会被忽略。</p><h5 id="使用示例-16" tabindex="-1"><a class="header-anchor" href="#使用示例-16" aria-hidden="true">#</a> 使用示例</h5><h6 id="精确查询" tabindex="-1"><a class="header-anchor" href="#精确查询" aria-hidden="true">#</a> 精确查询</h6><p>当<code>error</code>参数缺省或为0时,本函数计算精确绝对中位差。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s0| |
| +-----------------------------+------------+ |
| |2021-03-17T10:32:17.054+08:00| 0.5319929| |
| |2021-03-17T10:32:18.054+08:00| 0.9304316| |
| |2021-03-17T10:32:19.054+08:00| -1.4800133| |
| |2021-03-17T10:32:20.054+08:00| 0.6114087| |
| |2021-03-17T10:32:21.054+08:00| 2.5163336| |
| |2021-03-17T10:32:22.054+08:00| -1.0845392| |
| |2021-03-17T10:32:23.054+08:00| 1.0562582| |
| |2021-03-17T10:32:24.054+08:00| 1.3867859| |
| |2021-03-17T10:32:25.054+08:00| -0.45429882| |
| |2021-03-17T10:32:26.054+08:00| 1.0353678| |
| |2021-03-17T10:32:27.054+08:00| 0.7307929| |
| |2021-03-17T10:32:28.054+08:00| 2.3167255| |
| |2021-03-17T10:32:29.054+08:00| 2.342443| |
| |2021-03-17T10:32:30.054+08:00| 1.5809103| |
| |2021-03-17T10:32:31.054+08:00| 1.4829416| |
| |2021-03-17T10:32:32.054+08:00| 1.5800357| |
| |2021-03-17T10:32:33.054+08:00| 0.7124368| |
| |2021-03-17T10:32:34.054+08:00| -0.78597564| |
| |2021-03-17T10:32:35.054+08:00| 1.2058644| |
| |2021-03-17T10:32:36.054+08:00| 1.4215064| |
| |2021-03-17T10:32:37.054+08:00| 1.2808295| |
| |2021-03-17T10:32:38.054+08:00| -0.6173715| |
| |2021-03-17T10:32:39.054+08:00| 0.06644377| |
| |2021-03-17T10:32:40.054+08:00| 2.349338| |
| |2021-03-17T10:32:41.054+08:00| 1.7335888| |
| |2021-03-17T10:32:42.054+08:00| 1.5872132| |
| ............ |
| Total line number = 10000 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> mad<span class="token punctuation">(</span>s0<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------+ |
| | Time| mad(root.test.s0)| |
| +-----------------------------+------------------+ |
| |1970-01-01T08:00:00.000+08:00|0.6806197166442871| |
| +-----------------------------+------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="近似查询" tabindex="-1"><a class="header-anchor" href="#近似查询" aria-hidden="true">#</a> 近似查询</h6><p>当<code>error</code>参数取值不为 0 时,本函数计算近似绝对中位差。</p><p>输入序列同上,用于查询的 SQL 语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> mad<span class="token punctuation">(</span>s0<span class="token punctuation">,</span> <span class="token string">"error"</span><span class="token operator">=</span><span class="token string">"0.01"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------------------------+ |
| | Time|mad(root.test.s0, "error"="0.01")| |
| +-----------------------------+---------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.6806616245859518| |
| +-----------------------------+---------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="median" tabindex="-1"><a class="header-anchor" href="#median" aria-hidden="true">#</a> Median</h4><h5 id="函数简介-12" tabindex="-1"><a class="header-anchor" href="#函数简介-12" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算单列数值型数据的精确或近似中位数。中位数是顺序排列的一组数据中居于中间位置的数;当序列有偶数个时,中位数为中间二者的平均数。</p><p><strong>函数名:</strong> MEDIAN</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>error</code>:近似中位数的基于排名的误差百分比,取值范围 [0,1),默认值为 0。如当<code>error</code>=0.01 时,计算出的中位数的真实排名百分比在 0.49~0.51 之间。当<code>error</code>=0 时,计算结果为精确中位数。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE,序列仅包含一个时间戳为 0、值为中位数的数据点。</p><h5 id="使用示例-17" tabindex="-1"><a class="header-anchor" href="#使用示例-17" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s0| |
| +-----------------------------+------------+ |
| |2021-03-17T10:32:17.054+08:00| 0.5319929| |
| |2021-03-17T10:32:18.054+08:00| 0.9304316| |
| |2021-03-17T10:32:19.054+08:00| -1.4800133| |
| |2021-03-17T10:32:20.054+08:00| 0.6114087| |
| |2021-03-17T10:32:21.054+08:00| 2.5163336| |
| |2021-03-17T10:32:22.054+08:00| -1.0845392| |
| |2021-03-17T10:32:23.054+08:00| 1.0562582| |
| |2021-03-17T10:32:24.054+08:00| 1.3867859| |
| |2021-03-17T10:32:25.054+08:00| -0.45429882| |
| |2021-03-17T10:32:26.054+08:00| 1.0353678| |
| |2021-03-17T10:32:27.054+08:00| 0.7307929| |
| |2021-03-17T10:32:28.054+08:00| 2.3167255| |
| |2021-03-17T10:32:29.054+08:00| 2.342443| |
| |2021-03-17T10:32:30.054+08:00| 1.5809103| |
| |2021-03-17T10:32:31.054+08:00| 1.4829416| |
| |2021-03-17T10:32:32.054+08:00| 1.5800357| |
| |2021-03-17T10:32:33.054+08:00| 0.7124368| |
| |2021-03-17T10:32:34.054+08:00| -0.78597564| |
| |2021-03-17T10:32:35.054+08:00| 1.2058644| |
| |2021-03-17T10:32:36.054+08:00| 1.4215064| |
| |2021-03-17T10:32:37.054+08:00| 1.2808295| |
| |2021-03-17T10:32:38.054+08:00| -0.6173715| |
| |2021-03-17T10:32:39.054+08:00| 0.06644377| |
| |2021-03-17T10:32:40.054+08:00| 2.349338| |
| |2021-03-17T10:32:41.054+08:00| 1.7335888| |
| |2021-03-17T10:32:42.054+08:00| 1.5872132| |
| ............ |
| Total line number = 10000 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> median<span class="token punctuation">(</span>s0<span class="token punctuation">,</span> <span class="token string">"error"</span><span class="token operator">=</span><span class="token string">"0.01"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------+ |
| | Time|median(root.test.s0, "error"="0.01")| |
| +-----------------------------+------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 1.021884560585022| |
| +-----------------------------+------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="minmax" tabindex="-1"><a class="header-anchor" href="#minmax" aria-hidden="true">#</a> MinMax</h4><h5 id="函数简介-13" tabindex="-1"><a class="header-anchor" href="#函数简介-13" aria-hidden="true">#</a> 函数简介</h5><p>本函数将输入序列使用 min-max 方法进行标准化。最小值归一至 0,最大值归一至 1.</p><p><strong>函数名:</strong> MINMAX</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>compute</code>:若设置为"batch",则将数据全部读入后转换;若设置为 "stream",则需用户提供最大值及最小值进行流式计算转换。默认为 "batch"。</li><li><code>min</code>:使用流式计算时的最小值。</li><li><code>max</code>:使用流式计算时的最大值。</li></ul><p><strong>输出序列</strong>:输出单个序列,类型为 DOUBLE。</p><h5 id="使用示例-18" tabindex="-1"><a class="header-anchor" href="#使用示例-18" aria-hidden="true">#</a> 使用示例</h5><h6 id="全数据计算" tabindex="-1"><a class="header-anchor" href="#全数据计算" aria-hidden="true">#</a> 全数据计算</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s1| |
| +-----------------------------+------------+ |
| |1970-01-01T08:00:00.100+08:00| 0.0| |
| |1970-01-01T08:00:00.200+08:00| 0.0| |
| |1970-01-01T08:00:00.300+08:00| 1.0| |
| |1970-01-01T08:00:00.400+08:00| -1.0| |
| |1970-01-01T08:00:00.500+08:00| 0.0| |
| |1970-01-01T08:00:00.600+08:00| 0.0| |
| |1970-01-01T08:00:00.700+08:00| -2.0| |
| |1970-01-01T08:00:00.800+08:00| 2.0| |
| |1970-01-01T08:00:00.900+08:00| 0.0| |
| |1970-01-01T08:00:01.000+08:00| 0.0| |
| |1970-01-01T08:00:01.100+08:00| 1.0| |
| |1970-01-01T08:00:01.200+08:00| -1.0| |
| |1970-01-01T08:00:01.300+08:00| -1.0| |
| |1970-01-01T08:00:01.400+08:00| 1.0| |
| |1970-01-01T08:00:01.500+08:00| 0.0| |
| |1970-01-01T08:00:01.600+08:00| 0.0| |
| |1970-01-01T08:00:01.700+08:00| 10.0| |
| |1970-01-01T08:00:01.800+08:00| 2.0| |
| |1970-01-01T08:00:01.900+08:00| -2.0| |
| |1970-01-01T08:00:02.000+08:00| 0.0| |
| +-----------------------------+------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> minmax<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------+ |
| | Time|minmax(root.test.s1)| |
| +-----------------------------+--------------------+ |
| |1970-01-01T08:00:00.100+08:00| 0.16666666666666666| |
| |1970-01-01T08:00:00.200+08:00| 0.16666666666666666| |
| |1970-01-01T08:00:00.300+08:00| 0.25| |
| |1970-01-01T08:00:00.400+08:00| 0.08333333333333333| |
| |1970-01-01T08:00:00.500+08:00| 0.16666666666666666| |
| |1970-01-01T08:00:00.600+08:00| 0.16666666666666666| |
| |1970-01-01T08:00:00.700+08:00| 0.0| |
| |1970-01-01T08:00:00.800+08:00| 0.3333333333333333| |
| |1970-01-01T08:00:00.900+08:00| 0.16666666666666666| |
| |1970-01-01T08:00:01.000+08:00| 0.16666666666666666| |
| |1970-01-01T08:00:01.100+08:00| 0.25| |
| |1970-01-01T08:00:01.200+08:00| 0.08333333333333333| |
| |1970-01-01T08:00:01.300+08:00| 0.08333333333333333| |
| |1970-01-01T08:00:01.400+08:00| 0.25| |
| |1970-01-01T08:00:01.500+08:00| 0.16666666666666666| |
| |1970-01-01T08:00:01.600+08:00| 0.16666666666666666| |
| |1970-01-01T08:00:01.700+08:00| 1.0| |
| |1970-01-01T08:00:01.800+08:00| 0.3333333333333333| |
| |1970-01-01T08:00:01.900+08:00| 0.0| |
| |1970-01-01T08:00:02.000+08:00| 0.16666666666666666| |
| +-----------------------------+--------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="mode" tabindex="-1"><a class="header-anchor" href="#mode" aria-hidden="true">#</a> Mode</h4><h5 id="函数简介-14" tabindex="-1"><a class="header-anchor" href="#函数简介-14" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算时间序列的众数,即出现次数最多的元素。</p><p><strong>函数名:</strong> MODE</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型可以是任意的。</p><p><strong>输出序列:</strong> 输出单个序列,类型与输入相同,序列仅包含一个时间戳为众数第一次出现的时间戳、值为众数的数据点。</p><p><strong>提示:</strong></p><ul><li>如果有多个出现次数最多的元素,将会输出任意一个。</li><li>数据中的空值和缺失值将会被忽略,但<code>NaN</code>不会被忽略。</li></ul><h5 id="使用示例-19" tabindex="-1"><a class="header-anchor" href="#使用示例-19" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d2.s2| |
| +-----------------------------+---------------+ |
| |1970-01-01T08:00:00.001+08:00| Hello| |
| |1970-01-01T08:00:00.002+08:00| hello| |
| |1970-01-01T08:00:00.003+08:00| Hello| |
| |1970-01-01T08:00:00.004+08:00| World| |
| |1970-01-01T08:00:00.005+08:00| World| |
| |1970-01-01T08:00:01.600+08:00| World| |
| |1970-01-15T09:37:34.451+08:00| Hello| |
| |1970-01-15T09:37:34.452+08:00| hello| |
| |1970-01-15T09:37:34.453+08:00| Hello| |
| |1970-01-15T09:37:34.454+08:00| World| |
| |1970-01-15T09:37:34.455+08:00| World| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> <span class="token keyword">mode</span><span class="token punctuation">(</span>s2<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------------+ |
| | Time|mode(root.test.d2.s2)| |
| +-----------------------------+---------------------+ |
| |1970-01-01T08:00:00.004+08:00| World| |
| +-----------------------------+---------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="mvavg" tabindex="-1"><a class="header-anchor" href="#mvavg" aria-hidden="true">#</a> MvAvg</h4><h5 id="函数简介-15" tabindex="-1"><a class="header-anchor" href="#函数简介-15" aria-hidden="true">#</a> 函数简介</h5><p>本函数计算序列的移动平均。</p><p><strong>函数名:</strong> MVAVG</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>window</code>:移动窗口的长度。默认值为 10.</li></ul><p><strong>输出序列</strong>:输出单个序列,类型为 DOUBLE。</p><h5 id="使用示例-20" tabindex="-1"><a class="header-anchor" href="#使用示例-20" aria-hidden="true">#</a> 使用示例</h5><h6 id="指定窗口长度" tabindex="-1"><a class="header-anchor" href="#指定窗口长度" aria-hidden="true">#</a> 指定窗口长度</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s1| |
| +-----------------------------+------------+ |
| |1970-01-01T08:00:00.100+08:00| 0.0| |
| |1970-01-01T08:00:00.200+08:00| 0.0| |
| |1970-01-01T08:00:00.300+08:00| 1.0| |
| |1970-01-01T08:00:00.400+08:00| -1.0| |
| |1970-01-01T08:00:00.500+08:00| 0.0| |
| |1970-01-01T08:00:00.600+08:00| 0.0| |
| |1970-01-01T08:00:00.700+08:00| -2.0| |
| |1970-01-01T08:00:00.800+08:00| 2.0| |
| |1970-01-01T08:00:00.900+08:00| 0.0| |
| |1970-01-01T08:00:01.000+08:00| 0.0| |
| |1970-01-01T08:00:01.100+08:00| 1.0| |
| |1970-01-01T08:00:01.200+08:00| -1.0| |
| |1970-01-01T08:00:01.300+08:00| -1.0| |
| |1970-01-01T08:00:01.400+08:00| 1.0| |
| |1970-01-01T08:00:01.500+08:00| 0.0| |
| |1970-01-01T08:00:01.600+08:00| 0.0| |
| |1970-01-01T08:00:01.700+08:00| 10.0| |
| |1970-01-01T08:00:01.800+08:00| 2.0| |
| |1970-01-01T08:00:01.900+08:00| -2.0| |
| |1970-01-01T08:00:02.000+08:00| 0.0| |
| +-----------------------------+------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> mvavg<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">"window"</span><span class="token operator">=</span><span class="token string">"3"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------------------------+ |
| | Time|mvavg(root.test.s1, "window"="3")| |
| +-----------------------------+---------------------------------+ |
| |1970-01-01T08:00:00.300+08:00| 0.3333333333333333| |
| |1970-01-01T08:00:00.400+08:00| 0.0| |
| |1970-01-01T08:00:00.500+08:00| -0.3333333333333333| |
| |1970-01-01T08:00:00.600+08:00| 0.0| |
| |1970-01-01T08:00:00.700+08:00| -0.6666666666666666| |
| |1970-01-01T08:00:00.800+08:00| 0.0| |
| |1970-01-01T08:00:00.900+08:00| 0.6666666666666666| |
| |1970-01-01T08:00:01.000+08:00| 0.0| |
| |1970-01-01T08:00:01.100+08:00| 0.3333333333333333| |
| |1970-01-01T08:00:01.200+08:00| 0.0| |
| |1970-01-01T08:00:01.300+08:00| -0.6666666666666666| |
| |1970-01-01T08:00:01.400+08:00| 0.0| |
| |1970-01-01T08:00:01.500+08:00| 0.3333333333333333| |
| |1970-01-01T08:00:01.600+08:00| 0.0| |
| |1970-01-01T08:00:01.700+08:00| 3.3333333333333335| |
| |1970-01-01T08:00:01.800+08:00| 4.0| |
| |1970-01-01T08:00:01.900+08:00| 0.0| |
| |1970-01-01T08:00:02.000+08:00| -0.6666666666666666| |
| +-----------------------------+---------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="pacf" tabindex="-1"><a class="header-anchor" href="#pacf" aria-hidden="true">#</a> PACF</h4><h5 id="函数简介-16" tabindex="-1"><a class="header-anchor" href="#函数简介-16" aria-hidden="true">#</a> 函数简介</h5><p>本函数通过求解 Yule-Walker 方程,计算序列的偏自相关系数。对于特殊的输入序列,方程可能没有解,此时输出<code>NaN</code>。</p><p><strong>函数名:</strong> PACF</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>lag</code>:最大滞后阶数。默认值为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>min</mi><mo></mo><mo stretchy="false">(</mo><mn>10</mn><msub><mrow><mi>log</mi><mo></mo></mrow><mn>10</mn></msub><mi>n</mi><mo separator="true">,</mo><mi>n</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\min(10\log_{10}n,n-1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop">min</span><span class="mopen">(</span><span class="mord">10</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.207em;"><span style="top:-2.4559em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">10</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2441em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span>表示数据点个数。</li></ul><p><strong>输出序列</strong>:输出单个序列,类型为 DOUBLE。</p><h5 id="使用示例-21" tabindex="-1"><a class="header-anchor" href="#使用示例-21" aria-hidden="true">#</a> 使用示例</h5><h6 id="指定滞后阶数" tabindex="-1"><a class="header-anchor" href="#指定滞后阶数" aria-hidden="true">#</a> 指定滞后阶数</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s1| |
| +-----------------------------+------------+ |
| |2019-12-27T00:00:00.000+08:00| 5.0| |
| |2019-12-27T00:05:00.000+08:00| 5.0| |
| |2019-12-27T00:10:00.000+08:00| 5.0| |
| |2019-12-27T00:15:00.000+08:00| 5.0| |
| |2019-12-27T00:20:00.000+08:00| 6.0| |
| |2019-12-27T00:25:00.000+08:00| 5.0| |
| |2019-12-27T00:30:00.000+08:00| 6.0| |
| |2019-12-27T00:35:00.000+08:00| 6.0| |
| |2019-12-27T00:40:00.000+08:00| 6.0| |
| |2019-12-27T00:45:00.000+08:00| 6.0| |
| |2019-12-27T00:50:00.000+08:00| 6.0| |
| |2019-12-27T00:55:00.000+08:00| 5.982609| |
| |2019-12-27T01:00:00.000+08:00| 5.9652176| |
| |2019-12-27T01:05:00.000+08:00| 5.947826| |
| |2019-12-27T01:10:00.000+08:00| 5.9304347| |
| |2019-12-27T01:15:00.000+08:00| 5.9130435| |
| |2019-12-27T01:20:00.000+08:00| 5.8956523| |
| |2019-12-27T01:25:00.000+08:00| 5.878261| |
| |2019-12-27T01:30:00.000+08:00| 5.8608694| |
| |2019-12-27T01:35:00.000+08:00| 5.843478| |
| ............ |
| Total line number = 18066 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> pacf<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">"lag"</span><span class="token operator">=</span><span class="token string">"5"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------------------+ |
| | Time|pacf(root.test.s1, "lag"="5")| |
| +-----------------------------+-----------------------------+ |
| |2019-12-27T00:00:00.000+08:00| 1.0| |
| |2019-12-27T00:05:00.000+08:00| 0.3528915091942786| |
| |2019-12-27T00:10:00.000+08:00| 0.1761346122516304| |
| |2019-12-27T00:15:00.000+08:00| 0.1492391973294682| |
| |2019-12-27T00:20:00.000+08:00| 0.03560059645868398| |
| |2019-12-27T00:25:00.000+08:00| 0.0366222998995286| |
| +-----------------------------+-----------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="percentile" tabindex="-1"><a class="header-anchor" href="#percentile" aria-hidden="true">#</a> Percentile</h4><h5 id="函数简介-17" tabindex="-1"><a class="header-anchor" href="#函数简介-17" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算单列数值型数据的精确或近似分位数。</p><p><strong>函数名:</strong> PERCENTILE</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>rank</code>:所求分位数在所有数据中的排名百分比,取值范围为 (0,1],默认值为 0.5。如当设为 0.5时则计算中位数。</li><li><code>error</code>:近似分位数的基于排名的误差百分比,取值范围为 [0,1),默认值为0。如<code>rank</code>=0.5 且<code>error</code>=0.01,则计算出的分位数的真实排名百分比在 0.49~0.51之间。当<code>error</code>=0 时,计算结果为精确分位数。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型与输入序列相同。当<code>error</code>=0时,序列仅包含一个时间戳为分位数第一次出现的时间戳、值为分位数的数据点;否则,输出值的时间戳为0。</p><p><strong>提示:</strong> 数据中的空值、缺失值和<code>NaN</code>将会被忽略。</p><h5 id="使用示例-22" tabindex="-1"><a class="header-anchor" href="#使用示例-22" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s0| |
| +-----------------------------+------------+ |
| |2021-03-17T10:32:17.054+08:00| 0.5319929| |
| |2021-03-17T10:32:18.054+08:00| 0.9304316| |
| |2021-03-17T10:32:19.054+08:00| -1.4800133| |
| |2021-03-17T10:32:20.054+08:00| 0.6114087| |
| |2021-03-17T10:32:21.054+08:00| 2.5163336| |
| |2021-03-17T10:32:22.054+08:00| -1.0845392| |
| |2021-03-17T10:32:23.054+08:00| 1.0562582| |
| |2021-03-17T10:32:24.054+08:00| 1.3867859| |
| |2021-03-17T10:32:25.054+08:00| -0.45429882| |
| |2021-03-17T10:32:26.054+08:00| 1.0353678| |
| |2021-03-17T10:32:27.054+08:00| 0.7307929| |
| |2021-03-17T10:32:28.054+08:00| 2.3167255| |
| |2021-03-17T10:32:29.054+08:00| 2.342443| |
| |2021-03-17T10:32:30.054+08:00| 1.5809103| |
| |2021-03-17T10:32:31.054+08:00| 1.4829416| |
| |2021-03-17T10:32:32.054+08:00| 1.5800357| |
| |2021-03-17T10:32:33.054+08:00| 0.7124368| |
| |2021-03-17T10:32:34.054+08:00| -0.78597564| |
| |2021-03-17T10:32:35.054+08:00| 1.2058644| |
| |2021-03-17T10:32:36.054+08:00| 1.4215064| |
| |2021-03-17T10:32:37.054+08:00| 1.2808295| |
| |2021-03-17T10:32:38.054+08:00| -0.6173715| |
| |2021-03-17T10:32:39.054+08:00| 0.06644377| |
| |2021-03-17T10:32:40.054+08:00| 2.349338| |
| |2021-03-17T10:32:41.054+08:00| 1.7335888| |
| |2021-03-17T10:32:42.054+08:00| 1.5872132| |
| ............ |
| Total line number = 10000 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> percentile<span class="token punctuation">(</span>s0<span class="token punctuation">,</span> <span class="token string">"rank"</span><span class="token operator">=</span><span class="token string">"0.2"</span><span class="token punctuation">,</span> <span class="token string">"error"</span><span class="token operator">=</span><span class="token string">"0.01"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------------------------+ |
| | Time|percentile(root.test.s0, "rank"="0.2", "error"="0.01")| |
| +-----------------------------+------------------------------------------------------+ |
| |2021-03-17T10:35:02.054+08:00| 0.1801469624042511| |
| +-----------------------------+------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="quantile" tabindex="-1"><a class="header-anchor" href="#quantile" aria-hidden="true">#</a> Quantile</h4><h5 id="函数简介-18" tabindex="-1"><a class="header-anchor" href="#函数简介-18" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算单列数值型数据的近似分位数。本函数基于KLL sketch算法实现。</p><p><strong>函数名:</strong> QUANTILE</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>rank</code>:所求分位数在所有数据中的排名比,取值范围为 (0,1],默认值为 0.5。如当设为 0.5时则计算近似中位数。</li><li><code>K</code>:允许维护的KLL sketch大小,最小值为100,默认值为800。如<code>rank</code>=0.5 且<code>K</code>=800,则计算出的分位数的真实排名比有至少99%的可能性在 0.49~0.51之间。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型与输入序列相同。输出值的时间戳为0。</p><p><strong>提示:</strong> 数据中的空值、缺失值和<code>NaN</code>将会被忽略。</p><h5 id="使用示例-23" tabindex="-1"><a class="header-anchor" href="#使用示例-23" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s0| |
| +-----------------------------+------------+ |
| |2021-03-17T10:32:17.054+08:00| 0.5319929| |
| |2021-03-17T10:32:18.054+08:00| 0.9304316| |
| |2021-03-17T10:32:19.054+08:00| -1.4800133| |
| |2021-03-17T10:32:20.054+08:00| 0.6114087| |
| |2021-03-17T10:32:21.054+08:00| 2.5163336| |
| |2021-03-17T10:32:22.054+08:00| -1.0845392| |
| |2021-03-17T10:32:23.054+08:00| 1.0562582| |
| |2021-03-17T10:32:24.054+08:00| 1.3867859| |
| |2021-03-17T10:32:25.054+08:00| -0.45429882| |
| |2021-03-17T10:32:26.054+08:00| 1.0353678| |
| |2021-03-17T10:32:27.054+08:00| 0.7307929| |
| |2021-03-17T10:32:28.054+08:00| 2.3167255| |
| |2021-03-17T10:32:29.054+08:00| 2.342443| |
| |2021-03-17T10:32:30.054+08:00| 1.5809103| |
| |2021-03-17T10:32:31.054+08:00| 1.4829416| |
| |2021-03-17T10:32:32.054+08:00| 1.5800357| |
| |2021-03-17T10:32:33.054+08:00| 0.7124368| |
| |2021-03-17T10:32:34.054+08:00| -0.78597564| |
| |2021-03-17T10:32:35.054+08:00| 1.2058644| |
| |2021-03-17T10:32:36.054+08:00| 1.4215064| |
| |2021-03-17T10:32:37.054+08:00| 1.2808295| |
| |2021-03-17T10:32:38.054+08:00| -0.6173715| |
| |2021-03-17T10:32:39.054+08:00| 0.06644377| |
| |2021-03-17T10:32:40.054+08:00| 2.349338| |
| |2021-03-17T10:32:41.054+08:00| 1.7335888| |
| |2021-03-17T10:32:42.054+08:00| 1.5872132| |
| ............ |
| Total line number = 10000 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> quantile<span class="token punctuation">(</span>s0<span class="token punctuation">,</span> <span class="token string">"rank"</span><span class="token operator">=</span><span class="token string">"0.2"</span><span class="token punctuation">,</span> <span class="token string">"K"</span><span class="token operator">=</span><span class="token string">"800"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------------------------+ |
| | Time|quantile(root.test.s0, "rank"="0.2", "K"="800")| |
| +-----------------------------+------------------------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.1801469624042511| |
| +-----------------------------+------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="period" tabindex="-1"><a class="header-anchor" href="#period" aria-hidden="true">#</a> Period</h4><h5 id="函数简介-19" tabindex="-1"><a class="header-anchor" href="#函数简介-19" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算单列数值型数据的周期。</p><p><strong>函数名:</strong> PERIOD</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>输出序列:</strong> 输出单个序列,类型为 INT32,序列仅包含一个时间戳为 0、值为周期的数据点。</p><h5 id="使用示例-24" tabindex="-1"><a class="header-anchor" href="#使用示例-24" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d3.s1| |
| +-----------------------------+---------------+ |
| |1970-01-01T08:00:00.001+08:00| 1.0| |
| |1970-01-01T08:00:00.002+08:00| 2.0| |
| |1970-01-01T08:00:00.003+08:00| 3.0| |
| |1970-01-01T08:00:00.004+08:00| 1.0| |
| |1970-01-01T08:00:00.005+08:00| 2.0| |
| |1970-01-01T08:00:00.006+08:00| 3.0| |
| |1970-01-01T08:00:00.007+08:00| 1.0| |
| |1970-01-01T08:00:00.008+08:00| 2.0| |
| |1970-01-01T08:00:00.009+08:00| 3.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> period<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d3 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------------+ |
| | Time|period(root.test.d3.s1)| |
| +-----------------------------+-----------------------+ |
| |1970-01-01T08:00:00.000+08:00| 3| |
| +-----------------------------+-----------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="qlb" tabindex="-1"><a class="header-anchor" href="#qlb" aria-hidden="true">#</a> QLB</h4><h5 id="函数简介-20" tabindex="-1"><a class="header-anchor" href="#函数简介-20" aria-hidden="true">#</a> 函数简介</h5><p>本函数对输入序列计算$Q_{LB} $统计量,并计算对应的p值。p值越小表明序列越有可能为非平稳序列。</p><p><strong>函数名:</strong> QLB</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>lag</code>:计算时用到的最大延迟阶数,取值应为 1 至 n-2 之间的整数,n 为序列采样总数。默认取 n-2。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE。该序列是$Q_{LB} $统计量对应的 p 值,时间标签代表偏移阶数。</p><p><strong>提示:</strong> $Q_{LB} $统计量由自相关系数求得,如需得到统计量而非 p 值,可以使用 ACF 函数。</p><h5 id="使用示例-25" tabindex="-1"><a class="header-anchor" href="#使用示例-25" aria-hidden="true">#</a> 使用示例</h5><h6 id="使用默认参数" tabindex="-1"><a class="header-anchor" href="#使用默认参数" aria-hidden="true">#</a> 使用默认参数</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |1970-01-01T00:00:00.100+08:00| 1.22| |
| |1970-01-01T00:00:00.200+08:00| -2.78| |
| |1970-01-01T00:00:00.300+08:00| 1.53| |
| |1970-01-01T00:00:00.400+08:00| 0.70| |
| |1970-01-01T00:00:00.500+08:00| 0.75| |
| |1970-01-01T00:00:00.600+08:00| -0.72| |
| |1970-01-01T00:00:00.700+08:00| -0.22| |
| |1970-01-01T00:00:00.800+08:00| 0.28| |
| |1970-01-01T00:00:00.900+08:00| 0.57| |
| |1970-01-01T00:00:01.000+08:00| -0.22| |
| |1970-01-01T00:00:01.100+08:00| -0.72| |
| |1970-01-01T00:00:01.200+08:00| 1.34| |
| |1970-01-01T00:00:01.300+08:00| -0.25| |
| |1970-01-01T00:00:01.400+08:00| 0.17| |
| |1970-01-01T00:00:01.500+08:00| 2.51| |
| |1970-01-01T00:00:01.600+08:00| 1.42| |
| |1970-01-01T00:00:01.700+08:00| -1.34| |
| |1970-01-01T00:00:01.800+08:00| -0.01| |
| |1970-01-01T00:00:01.900+08:00| -0.49| |
| |1970-01-01T00:00:02.000+08:00| 1.63| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> QLB<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------+ |
| | Time|QLB(root.test.d1.s1)| |
| +-----------------------------+--------------------+ |
| |1970-01-01T00:00:00.001+08:00| 0.2168702295315677| |
| |1970-01-01T00:00:00.002+08:00| 0.3068948509261751| |
| |1970-01-01T00:00:00.003+08:00| 0.4217859150918444| |
| |1970-01-01T00:00:00.004+08:00| 0.5114539874276656| |
| |1970-01-01T00:00:00.005+08:00| 0.6560619525616759| |
| |1970-01-01T00:00:00.006+08:00| 0.7722398654053280| |
| |1970-01-01T00:00:00.007+08:00| 0.8532491661465290| |
| |1970-01-01T00:00:00.008+08:00| 0.9028575017542528| |
| |1970-01-01T00:00:00.009+08:00| 0.9434989988192729| |
| |1970-01-01T00:00:00.010+08:00| 0.8950280161464689| |
| |1970-01-01T00:00:00.011+08:00| 0.7701048398839656| |
| |1970-01-01T00:00:00.012+08:00| 0.7845536060001281| |
| |1970-01-01T00:00:00.013+08:00| 0.5943030981705825| |
| |1970-01-01T00:00:00.014+08:00| 0.4618413512531093| |
| |1970-01-01T00:00:00.015+08:00| 0.2645948244673964| |
| |1970-01-01T00:00:00.016+08:00| 0.3167530476666645| |
| |1970-01-01T00:00:00.017+08:00| 0.2330010780351453| |
| |1970-01-01T00:00:00.018+08:00| 0.0666611237622325| |
| +-----------------------------+--------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="resample" tabindex="-1"><a class="header-anchor" href="#resample" aria-hidden="true">#</a> Resample</h4><h5 id="函数简介-21" tabindex="-1"><a class="header-anchor" href="#函数简介-21" aria-hidden="true">#</a> 函数简介</h5><p>本函数对输入序列按照指定的频率进行重采样,包括上采样和下采样。目前,本函数支持的上采样方法包括<code>NaN</code>填充法 (NaN)、前值填充法 (FFill)、后值填充法 (BFill) 以及线性插值法 (Linear);本函数支持的下采样方法为分组聚合,聚合方法包括最大值 (Max)、最小值 (Min)、首值 (First)、末值 (Last)、平均值 (Mean)和中位数 (Median)。</p><p><strong>函数名:</strong> RESAMPLE</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>every</code>:重采样频率,是一个有单位的正数。目前支持五种单位,分别是 'ms'(毫秒)、's'(秒)、'm'(分钟)、'h'(小时)和'd'(天)。该参数不允许缺省。</li><li><code>interp</code>:上采样的插值方法,取值为 'NaN'、'FFill'、'BFill' 或 'Linear'。在缺省情况下,使用<code>NaN</code>填充法。</li><li><code>aggr</code>:下采样的聚合方法,取值为 'Max'、'Min'、'First'、'Last'、'Mean' 或 'Median'。在缺省情况下,使用平均数聚合。</li><li><code>start</code>:重采样的起始时间(包含),是一个格式为 'yyyy-MM-dd HH:mm:ss' 的时间字符串。在缺省情况下,使用第一个有效数据点的时间戳。</li><li><code>end</code>:重采样的结束时间(不包含),是一个格式为 'yyyy-MM-dd HH:mm:ss' 的时间字符串。在缺省情况下,使用最后一个有效数据点的时间戳。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE。该序列按照重采样频率严格等间隔分布。</p><p><strong>提示:</strong> 数据中的<code>NaN</code>将会被忽略。</p><h5 id="使用示例-26" tabindex="-1"><a class="header-anchor" href="#使用示例-26" aria-hidden="true">#</a> 使用示例</h5><h6 id="上采样" tabindex="-1"><a class="header-anchor" href="#上采样" aria-hidden="true">#</a> 上采样</h6><p>当重采样频率高于数据原始频率时,将会进行上采样。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2021-03-06T16:00:00.000+08:00| 3.09| |
| |2021-03-06T16:15:00.000+08:00| 3.53| |
| |2021-03-06T16:30:00.000+08:00| 3.5| |
| |2021-03-06T16:45:00.000+08:00| 3.51| |
| |2021-03-06T17:00:00.000+08:00| 3.41| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> resample<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'every'</span><span class="token operator">=</span><span class="token string">'5m'</span><span class="token punctuation">,</span><span class="token string">'interp'</span><span class="token operator">=</span><span class="token string">'linear'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+----------------------------------------------------------+ |
| | Time|resample(root.test.d1.s1, "every"="5m", "interp"="linear")| |
| +-----------------------------+----------------------------------------------------------+ |
| |2021-03-06T16:00:00.000+08:00| 3.0899999141693115| |
| |2021-03-06T16:05:00.000+08:00| 3.2366665999094644| |
| |2021-03-06T16:10:00.000+08:00| 3.3833332856496177| |
| |2021-03-06T16:15:00.000+08:00| 3.5299999713897705| |
| |2021-03-06T16:20:00.000+08:00| 3.5199999809265137| |
| |2021-03-06T16:25:00.000+08:00| 3.509999990463257| |
| |2021-03-06T16:30:00.000+08:00| 3.5| |
| |2021-03-06T16:35:00.000+08:00| 3.503333330154419| |
| |2021-03-06T16:40:00.000+08:00| 3.506666660308838| |
| |2021-03-06T16:45:00.000+08:00| 3.509999990463257| |
| |2021-03-06T16:50:00.000+08:00| 3.4766666889190674| |
| |2021-03-06T16:55:00.000+08:00| 3.443333387374878| |
| |2021-03-06T17:00:00.000+08:00| 3.4100000858306885| |
| +-----------------------------+----------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="下采样" tabindex="-1"><a class="header-anchor" href="#下采样" aria-hidden="true">#</a> 下采样</h6><p>当重采样频率低于数据原始频率时,将会进行下采样。</p><p>输入序列同上,用于查询的 SQL 语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> resample<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'every'</span><span class="token operator">=</span><span class="token string">'30m'</span><span class="token punctuation">,</span><span class="token string">'aggr'</span><span class="token operator">=</span><span class="token string">'first'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------------------------------------------+ |
| | Time|resample(root.test.d1.s1, "every"="30m", "aggr"="first")| |
| +-----------------------------+--------------------------------------------------------+ |
| |2021-03-06T16:00:00.000+08:00| 3.0899999141693115| |
| |2021-03-06T16:30:00.000+08:00| 3.5| |
| |2021-03-06T17:00:00.000+08:00| 3.4100000858306885| |
| +-----------------------------+--------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="指定重采样时间段" tabindex="-1"><a class="header-anchor" href="#指定重采样时间段" aria-hidden="true">#</a> 指定重采样时间段</h6><p>可以使用<code>start</code>和<code>end</code>两个参数指定重采样的时间段,超出实际时间范围的部分会被插值填补。</p><p>输入序列同上,用于查询的 SQL 语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> resample<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'every'</span><span class="token operator">=</span><span class="token string">'30m'</span><span class="token punctuation">,</span><span class="token string">'start'</span><span class="token operator">=</span><span class="token string">'2021-03-06 15:00:00'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------------------------------------------------------------+ |
| | Time|resample(root.test.d1.s1, "every"="30m", "start"="2021-03-06 15:00:00")| |
| +-----------------------------+-----------------------------------------------------------------------+ |
| |2021-03-06T15:00:00.000+08:00| NaN| |
| |2021-03-06T15:30:00.000+08:00| NaN| |
| |2021-03-06T16:00:00.000+08:00| 3.309999942779541| |
| |2021-03-06T16:30:00.000+08:00| 3.5049999952316284| |
| |2021-03-06T17:00:00.000+08:00| 3.4100000858306885| |
| +-----------------------------+-----------------------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="sample" tabindex="-1"><a class="header-anchor" href="#sample" aria-hidden="true">#</a> Sample</h4><h5 id="函数简介-22" tabindex="-1"><a class="header-anchor" href="#函数简介-22" aria-hidden="true">#</a> 函数简介</h5><p>本函数对输入序列进行采样,即从输入序列中选取指定数量的数据点并输出。目前,本函数支持三种采样方法:<strong>蓄水池采样法 (reservoir sampling)</strong> 对数据进行随机采样,所有数据点被采样的概率相同;<strong>等距采样法 (isometric sampling)</strong> 按照相等的索引间隔对数据进行采样,<strong>最大三角采样法 (triangle sampling)</strong> 对所有数据会按采样率分桶,每个桶内会计算数据点间三角形面积,并保留面积最大的点,该算法通常用于数据的可视化展示中,采用过程可以保证一些关键的突变点在采用中得到保留,更多抽样算法细节可以阅读论文 <a href="http://skemman.is/stream/get/1946/15343/37285/3/SS_MSthesis.pdf" target="_blank" rel="noopener noreferrer">here<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a>。</p><p><strong>函数名:</strong> SAMPLE</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型可以是任意的。</p><p><strong>参数:</strong></p><ul><li><code>method</code>:采样方法,取值为 'reservoir','isometric' 或 'triangle' 。在缺省情况下,采用蓄水池采样法。</li><li><code>k</code>:采样数,它是一个正整数,在缺省情况下为 1。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型与输入序列相同。该序列的长度为采样数,序列中的每一个数据点都来自于输入序列。</p><p><strong>提示:</strong> 如果采样数大于序列长度,那么输入序列中所有的数据点都会被输出。</p><h5 id="使用示例-27" tabindex="-1"><a class="header-anchor" href="#使用示例-27" aria-hidden="true">#</a> 使用示例</h5><h6 id="蓄水池采样" tabindex="-1"><a class="header-anchor" href="#蓄水池采样" aria-hidden="true">#</a> 蓄水池采样</h6><p>当<code>method</code>参数为 'reservoir' 或缺省时,采用蓄水池采样法对输入序列进行采样。由于该采样方法具有随机性,下面展示的输出序列只是一种可能的结果。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:01.000+08:00| 1.0| |
| |2020-01-01T00:00:02.000+08:00| 2.0| |
| |2020-01-01T00:00:03.000+08:00| 3.0| |
| |2020-01-01T00:00:04.000+08:00| 4.0| |
| |2020-01-01T00:00:05.000+08:00| 5.0| |
| |2020-01-01T00:00:06.000+08:00| 6.0| |
| |2020-01-01T00:00:07.000+08:00| 7.0| |
| |2020-01-01T00:00:08.000+08:00| 8.0| |
| |2020-01-01T00:00:09.000+08:00| 9.0| |
| |2020-01-01T00:00:10.000+08:00| 10.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> sample<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'method'</span><span class="token operator">=</span><span class="token string">'reservoir'</span><span class="token punctuation">,</span><span class="token string">'k'</span><span class="token operator">=</span><span class="token string">'5'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------------------------+ |
| | Time|sample(root.test.d1.s1, "method"="reservoir", "k"="5")| |
| +-----------------------------+------------------------------------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 2.0| |
| |2020-01-01T00:00:03.000+08:00| 3.0| |
| |2020-01-01T00:00:05.000+08:00| 5.0| |
| |2020-01-01T00:00:08.000+08:00| 8.0| |
| |2020-01-01T00:00:10.000+08:00| 10.0| |
| +-----------------------------+------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="等距采样" tabindex="-1"><a class="header-anchor" href="#等距采样" aria-hidden="true">#</a> 等距采样</h6><p>当<code>method</code>参数为 'isometric' 时,采用等距采样法对输入序列进行采样。</p><p>输入序列同上,用于查询的 SQL 语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> sample<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'method'</span><span class="token operator">=</span><span class="token string">'isometric'</span><span class="token punctuation">,</span><span class="token string">'k'</span><span class="token operator">=</span><span class="token string">'5'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------------------------+ |
| | Time|sample(root.test.d1.s1, "method"="isometric", "k"="5")| |
| +-----------------------------+------------------------------------------------------+ |
| |2020-01-01T00:00:01.000+08:00| 1.0| |
| |2020-01-01T00:00:03.000+08:00| 3.0| |
| |2020-01-01T00:00:05.000+08:00| 5.0| |
| |2020-01-01T00:00:07.000+08:00| 7.0| |
| |2020-01-01T00:00:09.000+08:00| 9.0| |
| +-----------------------------+------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="segment" tabindex="-1"><a class="header-anchor" href="#segment" aria-hidden="true">#</a> Segment</h4><h5 id="函数简介-23" tabindex="-1"><a class="header-anchor" href="#函数简介-23" aria-hidden="true">#</a> 函数简介</h5><p>本函数按照数据的线性变化趋势将数据划分为多个子序列,返回分段直线拟合后的子序列首值或所有拟合值。</p><p><strong>函数名:</strong> SEGMENT</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><p><code>output</code>:"all" 输出所有拟合值;"first" 输出子序列起点拟合值。默认为 "first"。</p></li><li><p><code>error</code>:判定存在线性趋势的误差允许阈值。误差的定义为子序列进行线性拟合的误差的绝对值的均值。默认为 0.1.</p></li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE。</p><p><strong>提示:</strong> 函数默认所有数据等时间间隔分布。函数读取所有数据,若原始数据过多,请先进行降采样处理。拟合采用自底向上方法,子序列的尾值可能会被认作子序列首值输出。</p><h5 id="使用示例-28" tabindex="-1"><a class="header-anchor" href="#使用示例-28" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s1| |
| +-----------------------------+------------+ |
| |1970-01-01T08:00:00.000+08:00| 5.0| |
| |1970-01-01T08:00:00.100+08:00| 0.0| |
| |1970-01-01T08:00:00.200+08:00| 1.0| |
| |1970-01-01T08:00:00.300+08:00| 2.0| |
| |1970-01-01T08:00:00.400+08:00| 3.0| |
| |1970-01-01T08:00:00.500+08:00| 4.0| |
| |1970-01-01T08:00:00.600+08:00| 5.0| |
| |1970-01-01T08:00:00.700+08:00| 6.0| |
| |1970-01-01T08:00:00.800+08:00| 7.0| |
| |1970-01-01T08:00:00.900+08:00| 8.0| |
| |1970-01-01T08:00:01.000+08:00| 9.0| |
| |1970-01-01T08:00:01.100+08:00| 9.1| |
| |1970-01-01T08:00:01.200+08:00| 9.2| |
| |1970-01-01T08:00:01.300+08:00| 9.3| |
| |1970-01-01T08:00:01.400+08:00| 9.4| |
| |1970-01-01T08:00:01.500+08:00| 9.5| |
| |1970-01-01T08:00:01.600+08:00| 9.6| |
| |1970-01-01T08:00:01.700+08:00| 9.7| |
| |1970-01-01T08:00:01.800+08:00| 9.8| |
| |1970-01-01T08:00:01.900+08:00| 9.9| |
| |1970-01-01T08:00:02.000+08:00| 10.0| |
| |1970-01-01T08:00:02.100+08:00| 8.0| |
| |1970-01-01T08:00:02.200+08:00| 6.0| |
| |1970-01-01T08:00:02.300+08:00| 4.0| |
| |1970-01-01T08:00:02.400+08:00| 2.0| |
| |1970-01-01T08:00:02.500+08:00| 0.0| |
| |1970-01-01T08:00:02.600+08:00| -2.0| |
| |1970-01-01T08:00:02.700+08:00| -4.0| |
| |1970-01-01T08:00:02.800+08:00| -6.0| |
| |1970-01-01T08:00:02.900+08:00| -8.0| |
| |1970-01-01T08:00:03.000+08:00| -10.0| |
| |1970-01-01T08:00:03.100+08:00| 10.0| |
| |1970-01-01T08:00:03.200+08:00| 10.0| |
| |1970-01-01T08:00:03.300+08:00| 10.0| |
| |1970-01-01T08:00:03.400+08:00| 10.0| |
| |1970-01-01T08:00:03.500+08:00| 10.0| |
| |1970-01-01T08:00:03.600+08:00| 10.0| |
| |1970-01-01T08:00:03.700+08:00| 10.0| |
| |1970-01-01T08:00:03.800+08:00| 10.0| |
| |1970-01-01T08:00:03.900+08:00| 10.0| |
| +-----------------------------+------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> segment<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">"error"</span><span class="token operator">=</span><span class="token string">"0.1"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------+ |
| | Time|segment(root.test.s1, "error"="0.1")| |
| +-----------------------------+------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 5.0| |
| |1970-01-01T08:00:00.200+08:00| 1.0| |
| |1970-01-01T08:00:01.000+08:00| 9.0| |
| |1970-01-01T08:00:02.000+08:00| 10.0| |
| |1970-01-01T08:00:03.000+08:00| -10.0| |
| |1970-01-01T08:00:03.200+08:00| 10.0| |
| +-----------------------------+------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="skew" tabindex="-1"><a class="header-anchor" href="#skew" aria-hidden="true">#</a> Skew</h4><h5 id="函数简介-24" tabindex="-1"><a class="header-anchor" href="#函数简介-24" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算单列数值型数据的总体偏度</p><p><strong>函数名:</strong> SKEW</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE,序列仅包含一个时间戳为 0、值为总体偏度的数据点。</p><p><strong>提示:</strong> 数据中的空值、缺失值和<code>NaN</code>将会被忽略。</p><h5 id="使用示例-29" tabindex="-1"><a class="header-anchor" href="#使用示例-29" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:00.000+08:00| 1.0| |
| |2020-01-01T00:00:01.000+08:00| 2.0| |
| |2020-01-01T00:00:02.000+08:00| 3.0| |
| |2020-01-01T00:00:03.000+08:00| 4.0| |
| |2020-01-01T00:00:04.000+08:00| 5.0| |
| |2020-01-01T00:00:05.000+08:00| 6.0| |
| |2020-01-01T00:00:06.000+08:00| 7.0| |
| |2020-01-01T00:00:07.000+08:00| 8.0| |
| |2020-01-01T00:00:08.000+08:00| 9.0| |
| |2020-01-01T00:00:09.000+08:00| 10.0| |
| |2020-01-01T00:00:10.000+08:00| 10.0| |
| |2020-01-01T00:00:11.000+08:00| 10.0| |
| |2020-01-01T00:00:12.000+08:00| 10.0| |
| |2020-01-01T00:00:13.000+08:00| 10.0| |
| |2020-01-01T00:00:14.000+08:00| 10.0| |
| |2020-01-01T00:00:15.000+08:00| 10.0| |
| |2020-01-01T00:00:16.000+08:00| 10.0| |
| |2020-01-01T00:00:17.000+08:00| 10.0| |
| |2020-01-01T00:00:18.000+08:00| 10.0| |
| |2020-01-01T00:00:19.000+08:00| 10.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> skew<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------------+ |
| | Time| skew(root.test.d1.s1)| |
| +-----------------------------+-----------------------+ |
| |1970-01-01T08:00:00.000+08:00| -0.9998427402292644| |
| +-----------------------------+-----------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="spline" tabindex="-1"><a class="header-anchor" href="#spline" aria-hidden="true">#</a> Spline</h4><h5 id="函数简介-25" tabindex="-1"><a class="header-anchor" href="#函数简介-25" aria-hidden="true">#</a> 函数简介</h5><p>本函数提供对原始序列进行三次样条曲线拟合后的插值重采样。</p><p><strong>函数名:</strong> SPLINE</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>points</code>:重采样个数。</li></ul><p><strong>输出序列</strong>:输出单个序列,类型为 DOUBLE。</p><p><strong>提示</strong>:输出序列保留输入序列的首尾值,等时间间隔采样。仅当输入点个数不少于 4 个时才计算插值。</p><h5 id="使用示例-30" tabindex="-1"><a class="header-anchor" href="#使用示例-30" aria-hidden="true">#</a> 使用示例</h5><h6 id="指定插值个数" tabindex="-1"><a class="header-anchor" href="#指定插值个数" aria-hidden="true">#</a> 指定插值个数</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s1| |
| +-----------------------------+------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.0| |
| |1970-01-01T08:00:00.300+08:00| 1.2| |
| |1970-01-01T08:00:00.500+08:00| 1.7| |
| |1970-01-01T08:00:00.700+08:00| 2.0| |
| |1970-01-01T08:00:00.900+08:00| 2.1| |
| |1970-01-01T08:00:01.100+08:00| 2.0| |
| |1970-01-01T08:00:01.200+08:00| 1.8| |
| |1970-01-01T08:00:01.300+08:00| 1.2| |
| |1970-01-01T08:00:01.400+08:00| 1.0| |
| |1970-01-01T08:00:01.500+08:00| 1.6| |
| +-----------------------------+------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> spline<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">"points"</span><span class="token operator">=</span><span class="token string">"151"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------+ |
| | Time|spline(root.test.s1, "points"="151")| |
| +-----------------------------+------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.0| |
| |1970-01-01T08:00:00.010+08:00| 0.04870000251134237| |
| |1970-01-01T08:00:00.020+08:00| 0.09680000495910646| |
| |1970-01-01T08:00:00.030+08:00| 0.14430000734329226| |
| |1970-01-01T08:00:00.040+08:00| 0.19120000966389972| |
| |1970-01-01T08:00:00.050+08:00| 0.23750001192092896| |
| |1970-01-01T08:00:00.060+08:00| 0.2832000141143799| |
| |1970-01-01T08:00:00.070+08:00| 0.32830001624425253| |
| |1970-01-01T08:00:00.080+08:00| 0.3728000183105469| |
| |1970-01-01T08:00:00.090+08:00| 0.416700020313263| |
| |1970-01-01T08:00:00.100+08:00| 0.4600000222524008| |
| |1970-01-01T08:00:00.110+08:00| 0.5027000241279602| |
| |1970-01-01T08:00:00.120+08:00| 0.5448000259399414| |
| |1970-01-01T08:00:00.130+08:00| 0.5863000276883443| |
| |1970-01-01T08:00:00.140+08:00| 0.627200029373169| |
| |1970-01-01T08:00:00.150+08:00| 0.6675000309944153| |
| |1970-01-01T08:00:00.160+08:00| 0.7072000325520833| |
| |1970-01-01T08:00:00.170+08:00| 0.7463000340461731| |
| |1970-01-01T08:00:00.180+08:00| 0.7848000354766846| |
| |1970-01-01T08:00:00.190+08:00| 0.8227000368436178| |
| |1970-01-01T08:00:00.200+08:00| 0.8600000381469728| |
| |1970-01-01T08:00:00.210+08:00| 0.8967000393867494| |
| |1970-01-01T08:00:00.220+08:00| 0.9328000405629477| |
| |1970-01-01T08:00:00.230+08:00| 0.9683000416755676| |
| |1970-01-01T08:00:00.240+08:00| 1.0032000427246095| |
| |1970-01-01T08:00:00.250+08:00| 1.037500043710073| |
| |1970-01-01T08:00:00.260+08:00| 1.071200044631958| |
| |1970-01-01T08:00:00.270+08:00| 1.1043000454902647| |
| |1970-01-01T08:00:00.280+08:00| 1.1368000462849934| |
| |1970-01-01T08:00:00.290+08:00| 1.1687000470161437| |
| |1970-01-01T08:00:00.300+08:00| 1.2000000476837158| |
| |1970-01-01T08:00:00.310+08:00| 1.2307000483103594| |
| |1970-01-01T08:00:00.320+08:00| 1.2608000489139557| |
| |1970-01-01T08:00:00.330+08:00| 1.2903000494873524| |
| |1970-01-01T08:00:00.340+08:00| 1.3192000500233967| |
| |1970-01-01T08:00:00.350+08:00| 1.3475000505149364| |
| |1970-01-01T08:00:00.360+08:00| 1.3752000509548186| |
| |1970-01-01T08:00:00.370+08:00| 1.402300051335891| |
| |1970-01-01T08:00:00.380+08:00| 1.4288000516510009| |
| |1970-01-01T08:00:00.390+08:00| 1.4547000518929958| |
| |1970-01-01T08:00:00.400+08:00| 1.480000052054723| |
| |1970-01-01T08:00:00.410+08:00| 1.5047000521290301| |
| |1970-01-01T08:00:00.420+08:00| 1.5288000521087646| |
| |1970-01-01T08:00:00.430+08:00| 1.5523000519867738| |
| |1970-01-01T08:00:00.440+08:00| 1.575200051755905| |
| |1970-01-01T08:00:00.450+08:00| 1.597500051409006| |
| |1970-01-01T08:00:00.460+08:00| 1.619200050938924| |
| |1970-01-01T08:00:00.470+08:00| 1.6403000503385066| |
| |1970-01-01T08:00:00.480+08:00| 1.660800049600601| |
| |1970-01-01T08:00:00.490+08:00| 1.680700048718055| |
| |1970-01-01T08:00:00.500+08:00| 1.7000000476837158| |
| |1970-01-01T08:00:00.510+08:00| 1.7188475466453037| |
| |1970-01-01T08:00:00.520+08:00| 1.7373800457262996| |
| |1970-01-01T08:00:00.530+08:00| 1.7555825448831923| |
| |1970-01-01T08:00:00.540+08:00| 1.7734400440724702| |
| |1970-01-01T08:00:00.550+08:00| 1.790937543250622| |
| |1970-01-01T08:00:00.560+08:00| 1.8080600423741364| |
| |1970-01-01T08:00:00.570+08:00| 1.8247925413995016| |
| |1970-01-01T08:00:00.580+08:00| 1.8411200402832066| |
| |1970-01-01T08:00:00.590+08:00| 1.8570275389817397| |
| |1970-01-01T08:00:00.600+08:00| 1.8725000374515897| |
| |1970-01-01T08:00:00.610+08:00| 1.8875225356492449| |
| |1970-01-01T08:00:00.620+08:00| 1.902080033531194| |
| |1970-01-01T08:00:00.630+08:00| 1.9161575310539258| |
| |1970-01-01T08:00:00.640+08:00| 1.9297400281739288| |
| |1970-01-01T08:00:00.650+08:00| 1.9428125248476913| |
| |1970-01-01T08:00:00.660+08:00| 1.9553600210317021| |
| |1970-01-01T08:00:00.670+08:00| 1.96736751668245| |
| |1970-01-01T08:00:00.680+08:00| 1.9788200117564232| |
| |1970-01-01T08:00:00.690+08:00| 1.9897025062101101| |
| |1970-01-01T08:00:00.700+08:00| 2.0| |
| |1970-01-01T08:00:00.710+08:00| 2.0097024933913334| |
| |1970-01-01T08:00:00.720+08:00| 2.0188199867081615| |
| |1970-01-01T08:00:00.730+08:00| 2.027367479995188| |
| |1970-01-01T08:00:00.740+08:00| 2.0353599732971155| |
| |1970-01-01T08:00:00.750+08:00| 2.0428124666586482| |
| |1970-01-01T08:00:00.760+08:00| 2.049739960124489| |
| |1970-01-01T08:00:00.770+08:00| 2.056157453739342| |
| |1970-01-01T08:00:00.780+08:00| 2.06207994754791| |
| |1970-01-01T08:00:00.790+08:00| 2.067522441594897| |
| |1970-01-01T08:00:00.800+08:00| 2.072499935925006| |
| |1970-01-01T08:00:00.810+08:00| 2.07702743058294| |
| |1970-01-01T08:00:00.820+08:00| 2.081119925613404| |
| |1970-01-01T08:00:00.830+08:00| 2.0847924210611| |
| |1970-01-01T08:00:00.840+08:00| 2.0880599169707317| |
| |1970-01-01T08:00:00.850+08:00| 2.0909374133870027| |
| |1970-01-01T08:00:00.860+08:00| 2.0934399103546166| |
| |1970-01-01T08:00:00.870+08:00| 2.0955824079182768| |
| |1970-01-01T08:00:00.880+08:00| 2.0973799061226863| |
| |1970-01-01T08:00:00.890+08:00| 2.098847405012549| |
| |1970-01-01T08:00:00.900+08:00| 2.0999999046325684| |
| |1970-01-01T08:00:00.910+08:00| 2.1005574051201332| |
| |1970-01-01T08:00:00.920+08:00| 2.1002599065303778| |
| |1970-01-01T08:00:00.930+08:00| 2.0991524087846245| |
| |1970-01-01T08:00:00.940+08:00| 2.0972799118041947| |
| |1970-01-01T08:00:00.950+08:00| 2.0946874155104105| |
| |1970-01-01T08:00:00.960+08:00| 2.0914199198245944| |
| |1970-01-01T08:00:00.970+08:00| 2.0875224246680673| |
| |1970-01-01T08:00:00.980+08:00| 2.083039929962151| |
| |1970-01-01T08:00:00.990+08:00| 2.0780174356281687| |
| |1970-01-01T08:00:01.000+08:00| 2.0724999415874406| |
| |1970-01-01T08:00:01.010+08:00| 2.06653244776129| |
| |1970-01-01T08:00:01.020+08:00| 2.060159954071038| |
| |1970-01-01T08:00:01.030+08:00| 2.053427460438006| |
| |1970-01-01T08:00:01.040+08:00| 2.046379966783517| |
| |1970-01-01T08:00:01.050+08:00| 2.0390624730288924| |
| |1970-01-01T08:00:01.060+08:00| 2.031519979095454| |
| |1970-01-01T08:00:01.070+08:00| 2.0237974849045237| |
| |1970-01-01T08:00:01.080+08:00| 2.015939990377423| |
| |1970-01-01T08:00:01.090+08:00| 2.0079924954354746| |
| |1970-01-01T08:00:01.100+08:00| 2.0| |
| |1970-01-01T08:00:01.110+08:00| 1.9907018211101906| |
| |1970-01-01T08:00:01.120+08:00| 1.9788509124245144| |
| |1970-01-01T08:00:01.130+08:00| 1.9645127287932083| |
| |1970-01-01T08:00:01.140+08:00| 1.9477527250665083| |
| |1970-01-01T08:00:01.150+08:00| 1.9286363560946513| |
| |1970-01-01T08:00:01.160+08:00| 1.9072290767278735| |
| |1970-01-01T08:00:01.170+08:00| 1.8835963418164114| |
| |1970-01-01T08:00:01.180+08:00| 1.8578036062105014| |
| |1970-01-01T08:00:01.190+08:00| 1.8299163247603802| |
| |1970-01-01T08:00:01.200+08:00| 1.7999999523162842| |
| |1970-01-01T08:00:01.210+08:00| 1.7623635841923329| |
| |1970-01-01T08:00:01.220+08:00| 1.7129696477516976| |
| |1970-01-01T08:00:01.230+08:00| 1.6543635959181928| |
| |1970-01-01T08:00:01.240+08:00| 1.5890908816156328| |
| |1970-01-01T08:00:01.250+08:00| 1.5196969577678319| |
| |1970-01-01T08:00:01.260+08:00| 1.4487272772986044| |
| |1970-01-01T08:00:01.270+08:00| 1.3787272931317647| |
| |1970-01-01T08:00:01.280+08:00| 1.3122424581911272| |
| |1970-01-01T08:00:01.290+08:00| 1.251818225400506| |
| |1970-01-01T08:00:01.300+08:00| 1.2000000476837158| |
| |1970-01-01T08:00:01.310+08:00| 1.1548000470995912| |
| |1970-01-01T08:00:01.320+08:00| 1.1130667107899999| |
| |1970-01-01T08:00:01.330+08:00| 1.0756000393033045| |
| |1970-01-01T08:00:01.340+08:00| 1.043200033187868| |
| |1970-01-01T08:00:01.350+08:00| 1.016666692992053| |
| |1970-01-01T08:00:01.360+08:00| 0.9968000192642223| |
| |1970-01-01T08:00:01.370+08:00| 0.9844000125527389| |
| |1970-01-01T08:00:01.380+08:00| 0.9802666734059655| |
| |1970-01-01T08:00:01.390+08:00| 0.9852000023722649| |
| |1970-01-01T08:00:01.400+08:00| 1.0| |
| |1970-01-01T08:00:01.410+08:00| 1.023999999165535| |
| |1970-01-01T08:00:01.420+08:00| 1.0559999990463256| |
| |1970-01-01T08:00:01.430+08:00| 1.0959999996423722| |
| |1970-01-01T08:00:01.440+08:00| 1.1440000009536744| |
| |1970-01-01T08:00:01.450+08:00| 1.2000000029802322| |
| |1970-01-01T08:00:01.460+08:00| 1.264000005722046| |
| |1970-01-01T08:00:01.470+08:00| 1.3360000091791153| |
| |1970-01-01T08:00:01.480+08:00| 1.4160000133514405| |
| |1970-01-01T08:00:01.490+08:00| 1.5040000182390214| |
| |1970-01-01T08:00:01.500+08:00| 1.600000023841858| |
| +-----------------------------+------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="spread" tabindex="-1"><a class="header-anchor" href="#spread" aria-hidden="true">#</a> Spread</h4><h5 id="函数简介-26" tabindex="-1"><a class="header-anchor" href="#函数简介-26" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算时间序列的极差,即最大值减去最小值的结果。</p><p><strong>函数名:</strong> SPREAD</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>输出序列:</strong> 输出单个序列,类型与输入相同,序列仅包含一个时间戳为 0 、值为极差的数据点。</p><p><strong>提示:</strong> 数据中的空值、缺失值和<code>NaN</code>将会被忽略。</p><h5 id="使用示例-31" tabindex="-1"><a class="header-anchor" href="#使用示例-31" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 120.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> spread<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">00</span>:<span class="token number">30</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------------+ |
| | Time|spread(root.test.d1.s1)| |
| +-----------------------------+-----------------------+ |
| |1970-01-01T08:00:00.000+08:00| 26.0| |
| +-----------------------------+-----------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="stddev" tabindex="-1"><a class="header-anchor" href="#stddev" aria-hidden="true">#</a> Stddev</h4><h5 id="函数简介-27" tabindex="-1"><a class="header-anchor" href="#函数简介-27" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算单列数值型数据的总体标准差。</p><p><strong>函数名:</strong> STDDEV</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE。序列仅包含一个时间戳为 0、值为总体标准差的数据点。</p><p><strong>提示:</strong> 数据中的空值、缺失值和<code>NaN</code>将会被忽略。</p><h5 id="使用示例-32" tabindex="-1"><a class="header-anchor" href="#使用示例-32" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:00.000+08:00| 1.0| |
| |2020-01-01T00:00:01.000+08:00| 2.0| |
| |2020-01-01T00:00:02.000+08:00| 3.0| |
| |2020-01-01T00:00:03.000+08:00| 4.0| |
| |2020-01-01T00:00:04.000+08:00| 5.0| |
| |2020-01-01T00:00:05.000+08:00| 6.0| |
| |2020-01-01T00:00:06.000+08:00| 7.0| |
| |2020-01-01T00:00:07.000+08:00| 8.0| |
| |2020-01-01T00:00:08.000+08:00| 9.0| |
| |2020-01-01T00:00:09.000+08:00| 10.0| |
| |2020-01-01T00:00:10.000+08:00| 11.0| |
| |2020-01-01T00:00:11.000+08:00| 12.0| |
| |2020-01-01T00:00:12.000+08:00| 13.0| |
| |2020-01-01T00:00:13.000+08:00| 14.0| |
| |2020-01-01T00:00:14.000+08:00| 15.0| |
| |2020-01-01T00:00:15.000+08:00| 16.0| |
| |2020-01-01T00:00:16.000+08:00| 17.0| |
| |2020-01-01T00:00:17.000+08:00| 18.0| |
| |2020-01-01T00:00:18.000+08:00| 19.0| |
| |2020-01-01T00:00:19.000+08:00| 20.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> stddev<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------------+ |
| | Time|stddev(root.test.d1.s1)| |
| +-----------------------------+-----------------------+ |
| |1970-01-01T08:00:00.000+08:00| 5.7662812973353965| |
| +-----------------------------+-----------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="zscore" tabindex="-1"><a class="header-anchor" href="#zscore" aria-hidden="true">#</a> ZScore</h4><h5 id="函数简介-28" tabindex="-1"><a class="header-anchor" href="#函数简介-28" aria-hidden="true">#</a> 函数简介</h5><p>本函数将输入序列使用z-score方法进行归一化。</p><p><strong>函数名:</strong> ZSCORE</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>compute</code>:若设置为 "batch",则将数据全部读入后转换;若设置为 "stream",则需用户提供均值及方差进行流式计算转换。默认为 "batch"。</li><li><code>avg</code>:使用流式计算时的均值。</li><li><code>sd</code>:使用流式计算时的标准差。</li></ul><p><strong>输出序列</strong>:输出单个序列,类型为 DOUBLE。</p><h5 id="使用示例-33" tabindex="-1"><a class="header-anchor" href="#使用示例-33" aria-hidden="true">#</a> 使用示例</h5><h6 id="全数据计算-1" tabindex="-1"><a class="header-anchor" href="#全数据计算-1" aria-hidden="true">#</a> 全数据计算</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s1| |
| +-----------------------------+------------+ |
| |1970-01-01T08:00:00.100+08:00| 0.0| |
| |1970-01-01T08:00:00.200+08:00| 0.0| |
| |1970-01-01T08:00:00.300+08:00| 1.0| |
| |1970-01-01T08:00:00.400+08:00| -1.0| |
| |1970-01-01T08:00:00.500+08:00| 0.0| |
| |1970-01-01T08:00:00.600+08:00| 0.0| |
| |1970-01-01T08:00:00.700+08:00| -2.0| |
| |1970-01-01T08:00:00.800+08:00| 2.0| |
| |1970-01-01T08:00:00.900+08:00| 0.0| |
| |1970-01-01T08:00:01.000+08:00| 0.0| |
| |1970-01-01T08:00:01.100+08:00| 1.0| |
| |1970-01-01T08:00:01.200+08:00| -1.0| |
| |1970-01-01T08:00:01.300+08:00| -1.0| |
| |1970-01-01T08:00:01.400+08:00| 1.0| |
| |1970-01-01T08:00:01.500+08:00| 0.0| |
| |1970-01-01T08:00:01.600+08:00| 0.0| |
| |1970-01-01T08:00:01.700+08:00| 10.0| |
| |1970-01-01T08:00:01.800+08:00| 2.0| |
| |1970-01-01T08:00:01.900+08:00| -2.0| |
| |1970-01-01T08:00:02.000+08:00| 0.0| |
| +-----------------------------+------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> zscore<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------+ |
| | Time|zscore(root.test.s1)| |
| +-----------------------------+--------------------+ |
| |1970-01-01T08:00:00.100+08:00|-0.20672455764868078| |
| |1970-01-01T08:00:00.200+08:00|-0.20672455764868078| |
| |1970-01-01T08:00:00.300+08:00| 0.20672455764868078| |
| |1970-01-01T08:00:00.400+08:00| -0.6201736729460423| |
| |1970-01-01T08:00:00.500+08:00|-0.20672455764868078| |
| |1970-01-01T08:00:00.600+08:00|-0.20672455764868078| |
| |1970-01-01T08:00:00.700+08:00| -1.033622788243404| |
| |1970-01-01T08:00:00.800+08:00| 0.6201736729460423| |
| |1970-01-01T08:00:00.900+08:00|-0.20672455764868078| |
| |1970-01-01T08:00:01.000+08:00|-0.20672455764868078| |
| |1970-01-01T08:00:01.100+08:00| 0.20672455764868078| |
| |1970-01-01T08:00:01.200+08:00| -0.6201736729460423| |
| |1970-01-01T08:00:01.300+08:00| -0.6201736729460423| |
| |1970-01-01T08:00:01.400+08:00| 0.20672455764868078| |
| |1970-01-01T08:00:01.500+08:00|-0.20672455764868078| |
| |1970-01-01T08:00:01.600+08:00|-0.20672455764868078| |
| |1970-01-01T08:00:01.700+08:00| 3.9277665953249348| |
| |1970-01-01T08:00:01.800+08:00| 0.6201736729460423| |
| |1970-01-01T08:00:01.900+08:00| -1.033622788243404| |
| |1970-01-01T08:00:02.000+08:00|-0.20672455764868078| |
| +-----------------------------+--------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="异常检测" tabindex="-1"><a class="header-anchor" href="#异常检测" aria-hidden="true">#</a> 异常检测</h3><h4 id="iqr" tabindex="-1"><a class="header-anchor" href="#iqr" aria-hidden="true">#</a> IQR</h4><h5 id="函数简介-29" tabindex="-1"><a class="header-anchor" href="#函数简介-29" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于检验超出上下四分位数1.5倍IQR的数据分布异常。</p><p><strong>函数名:</strong> IQR</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>method</code>:若设置为 "batch",则将数据全部读入后检测;若设置为 "stream",则需用户提供上下四分位数进行流式检测。默认为 "batch"。</li><li><code>q1</code>:使用流式计算时的下四分位数。</li><li><code>q3</code>:使用流式计算时的上四分位数。</li></ul><p><strong>输出序列</strong>:输出单个序列,类型为 DOUBLE。</p><p><strong>说明</strong>:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>I</mi><mi>Q</mi><mi>R</mi><mo>=</mo><msub><mi>Q</mi><mn>3</mn></msub><mo>−</mo><msub><mi>Q</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">IQR=Q_3-Q_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal" style="margin-right:0.00773em;">QR</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p><h5 id="使用示例-34" tabindex="-1"><a class="header-anchor" href="#使用示例-34" aria-hidden="true">#</a> 使用示例</h5><h6 id="全数据计算-2" tabindex="-1"><a class="header-anchor" href="#全数据计算-2" aria-hidden="true">#</a> 全数据计算</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s1| |
| +-----------------------------+------------+ |
| |1970-01-01T08:00:00.100+08:00| 0.0| |
| |1970-01-01T08:00:00.200+08:00| 0.0| |
| |1970-01-01T08:00:00.300+08:00| 1.0| |
| |1970-01-01T08:00:00.400+08:00| -1.0| |
| |1970-01-01T08:00:00.500+08:00| 0.0| |
| |1970-01-01T08:00:00.600+08:00| 0.0| |
| |1970-01-01T08:00:00.700+08:00| -2.0| |
| |1970-01-01T08:00:00.800+08:00| 2.0| |
| |1970-01-01T08:00:00.900+08:00| 0.0| |
| |1970-01-01T08:00:01.000+08:00| 0.0| |
| |1970-01-01T08:00:01.100+08:00| 1.0| |
| |1970-01-01T08:00:01.200+08:00| -1.0| |
| |1970-01-01T08:00:01.300+08:00| -1.0| |
| |1970-01-01T08:00:01.400+08:00| 1.0| |
| |1970-01-01T08:00:01.500+08:00| 0.0| |
| |1970-01-01T08:00:01.600+08:00| 0.0| |
| |1970-01-01T08:00:01.700+08:00| 10.0| |
| |1970-01-01T08:00:01.800+08:00| 2.0| |
| |1970-01-01T08:00:01.900+08:00| -2.0| |
| |1970-01-01T08:00:02.000+08:00| 0.0| |
| +-----------------------------+------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> iqr<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------+ |
| | Time|iqr(root.test.s1)| |
| +-----------------------------+-----------------+ |
| |1970-01-01T08:00:01.700+08:00| 10.0| |
| +-----------------------------+-----------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="ksigma" tabindex="-1"><a class="header-anchor" href="#ksigma" aria-hidden="true">#</a> KSigma</h4><h5 id="函数简介-30" tabindex="-1"><a class="header-anchor" href="#函数简介-30" aria-hidden="true">#</a> 函数简介</h5><p>本函数利用动态 K-Sigma 算法进行异常检测。在一个窗口内,与平均值的差距超过k倍标准差的数据将被视作异常并输出。</p><p><strong>函数名:</strong> KSIGMA</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>k</code>:在动态 K-Sigma 算法中,分布异常的标准差倍数阈值,默认值为 3。</li><li><code>window</code>:动态 K-Sigma 算法的滑动窗口大小,默认值为 10000。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型与输入序列相同。</p><p><strong>提示:</strong> k 应大于 0,否则将不做输出。</p><h5 id="使用示例-35" tabindex="-1"><a class="header-anchor" href="#使用示例-35" aria-hidden="true">#</a> 使用示例</h5><h6 id="指定k" tabindex="-1"><a class="header-anchor" href="#指定k" aria-hidden="true">#</a> 指定k</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 0.0| |
| |2020-01-01T00:00:03.000+08:00| 50.0| |
| |2020-01-01T00:00:04.000+08:00| 100.0| |
| |2020-01-01T00:00:06.000+08:00| 150.0| |
| |2020-01-01T00:00:08.000+08:00| 200.0| |
| |2020-01-01T00:00:10.000+08:00| 200.0| |
| |2020-01-01T00:00:14.000+08:00| 200.0| |
| |2020-01-01T00:00:15.000+08:00| 200.0| |
| |2020-01-01T00:00:16.000+08:00| 200.0| |
| |2020-01-01T00:00:18.000+08:00| 200.0| |
| |2020-01-01T00:00:20.000+08:00| 150.0| |
| |2020-01-01T00:00:22.000+08:00| 100.0| |
| |2020-01-01T00:00:26.000+08:00| 50.0| |
| |2020-01-01T00:00:28.000+08:00| 0.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> ksigma<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">"k"</span><span class="token operator">=</span><span class="token string">"1.0"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">00</span>:<span class="token number">30</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------------------------+ |
| |Time |ksigma(root.test.d1.s1,"k"="3.0")| |
| +-----------------------------+---------------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 0.0| |
| |2020-01-01T00:00:03.000+08:00| 50.0| |
| |2020-01-01T00:00:26.000+08:00| 50.0| |
| |2020-01-01T00:00:28.000+08:00| 0.0| |
| +-----------------------------+---------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="lof" tabindex="-1"><a class="header-anchor" href="#lof" aria-hidden="true">#</a> LOF</h4><h5 id="函数简介-31" tabindex="-1"><a class="header-anchor" href="#函数简介-31" aria-hidden="true">#</a> 函数简介</h5><p>本函数使用局部离群点检测方法用于查找序列的密度异常。将根据提供的第k距离数及局部离群点因子(lof)阈值,判断输入数据是否为离群点,即异常,并输出各点的 LOF 值。</p><p><strong>函数名:</strong> LOF</p><p><strong>输入序列:</strong> 多个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>method</code>:使用的检测方法。默认为 default,以高维数据计算。设置为 series,将一维时间序列转换为高维数据计算。</li><li><code>k</code>:使用第k距离计算局部离群点因子.默认为 3。</li><li><code>window</code>:每次读取数据的窗口长度。默认为 10000.</li><li><code>windowsize</code>:使用series方法时,转化高维数据的维数,即单个窗口的大小。默认为 5。</li></ul><p><strong>输出序列:</strong> 输出单时间序列,类型为DOUBLE。</p><p><strong>提示:</strong> 不完整的数据行会被忽略,不参与计算,也不标记为离群点。</p><h5 id="使用示例-36" tabindex="-1"><a class="header-anchor" href="#使用示例-36" aria-hidden="true">#</a> 使用示例</h5><h6 id="默认参数" tabindex="-1"><a class="header-anchor" href="#默认参数" aria-hidden="true">#</a> 默认参数</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+---------------+ |
| | Time|root.test.d1.s1|root.test.d1.s2| |
| +-----------------------------+---------------+---------------+ |
| |1970-01-01T08:00:00.100+08:00| 0.0| 0.0| |
| |1970-01-01T08:00:00.200+08:00| 0.0| 1.0| |
| |1970-01-01T08:00:00.300+08:00| 1.0| 1.0| |
| |1970-01-01T08:00:00.400+08:00| 1.0| 0.0| |
| |1970-01-01T08:00:00.500+08:00| 0.0| -1.0| |
| |1970-01-01T08:00:00.600+08:00| -1.0| -1.0| |
| |1970-01-01T08:00:00.700+08:00| -1.0| 0.0| |
| |1970-01-01T08:00:00.800+08:00| 2.0| 2.0| |
| |1970-01-01T08:00:00.900+08:00| 0.0| null| |
| +-----------------------------+---------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> lof<span class="token punctuation">(</span>s1<span class="token punctuation">,</span>s2<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span><span class="token operator"><</span><span class="token number">1000</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------------------+ |
| | Time|lof(root.test.d1.s1, root.test.d1.s2)| |
| +-----------------------------+-------------------------------------+ |
| |1970-01-01T08:00:00.100+08:00| 3.8274824267668244| |
| |1970-01-01T08:00:00.200+08:00| 3.0117631741126156| |
| |1970-01-01T08:00:00.300+08:00| 2.838155437762879| |
| |1970-01-01T08:00:00.400+08:00| 3.0117631741126156| |
| |1970-01-01T08:00:00.500+08:00| 2.73518261244453| |
| |1970-01-01T08:00:00.600+08:00| 2.371440975708148| |
| |1970-01-01T08:00:00.700+08:00| 2.73518261244453| |
| |1970-01-01T08:00:00.800+08:00| 1.7561416374270742| |
| +-----------------------------+-------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="诊断一维时间序列" tabindex="-1"><a class="header-anchor" href="#诊断一维时间序列" aria-hidden="true">#</a> 诊断一维时间序列</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |1970-01-01T08:00:00.100+08:00| 1.0| |
| |1970-01-01T08:00:00.200+08:00| 2.0| |
| |1970-01-01T08:00:00.300+08:00| 3.0| |
| |1970-01-01T08:00:00.400+08:00| 4.0| |
| |1970-01-01T08:00:00.500+08:00| 5.0| |
| |1970-01-01T08:00:00.600+08:00| 6.0| |
| |1970-01-01T08:00:00.700+08:00| 7.0| |
| |1970-01-01T08:00:00.800+08:00| 8.0| |
| |1970-01-01T08:00:00.900+08:00| 9.0| |
| |1970-01-01T08:00:01.000+08:00| 10.0| |
| |1970-01-01T08:00:01.100+08:00| 11.0| |
| |1970-01-01T08:00:01.200+08:00| 12.0| |
| |1970-01-01T08:00:01.300+08:00| 13.0| |
| |1970-01-01T08:00:01.400+08:00| 14.0| |
| |1970-01-01T08:00:01.500+08:00| 15.0| |
| |1970-01-01T08:00:01.600+08:00| 16.0| |
| |1970-01-01T08:00:01.700+08:00| 17.0| |
| |1970-01-01T08:00:01.800+08:00| 18.0| |
| |1970-01-01T08:00:01.900+08:00| 19.0| |
| |1970-01-01T08:00:02.000+08:00| 20.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> lof<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">"method"</span><span class="token operator">=</span><span class="token string">"series"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span><span class="token operator"><</span><span class="token number">1000</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------+ |
| | Time|lof(root.test.d1.s1)| |
| +-----------------------------+--------------------+ |
| |1970-01-01T08:00:00.100+08:00| 3.77777777777778| |
| |1970-01-01T08:00:00.200+08:00| 4.32727272727273| |
| |1970-01-01T08:00:00.300+08:00| 4.85714285714286| |
| |1970-01-01T08:00:00.400+08:00| 5.40909090909091| |
| |1970-01-01T08:00:00.500+08:00| 5.94999999999999| |
| |1970-01-01T08:00:00.600+08:00| 6.43243243243243| |
| |1970-01-01T08:00:00.700+08:00| 6.79999999999999| |
| |1970-01-01T08:00:00.800+08:00| 7.0| |
| |1970-01-01T08:00:00.900+08:00| 7.0| |
| |1970-01-01T08:00:01.000+08:00| 6.79999999999999| |
| |1970-01-01T08:00:01.100+08:00| 6.43243243243243| |
| |1970-01-01T08:00:01.200+08:00| 5.94999999999999| |
| |1970-01-01T08:00:01.300+08:00| 5.40909090909091| |
| |1970-01-01T08:00:01.400+08:00| 4.85714285714286| |
| |1970-01-01T08:00:01.500+08:00| 4.32727272727273| |
| |1970-01-01T08:00:01.600+08:00| 3.77777777777778| |
| +-----------------------------+--------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="missdetect" tabindex="-1"><a class="header-anchor" href="#missdetect" aria-hidden="true">#</a> MissDetect</h4><h5 id="函数简介-32" tabindex="-1"><a class="header-anchor" href="#函数简介-32" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于检测数据中的缺失异常。在一些数据中,缺失数据会被线性插值填补,在数据中出现完美的线性片段,且这些片段往往长度较大。本函数通过在数据中发现这些完美线性片段来检测缺失异常。</p><p><strong>函数名:</strong> MISSDETECT</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>minlen</code>:被标记为异常的完美线性片段的最小长度,是一个大于等于 10 的整数,默认值为 10。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为 BOOLEAN,即该数据点是否为缺失异常。</p><p><strong>提示:</strong> 数据中的<code>NaN</code>将会被忽略。</p><h5 id="使用示例-37" tabindex="-1"><a class="header-anchor" href="#使用示例-37" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d2.s2| |
| +-----------------------------+---------------+ |
| |2021-07-01T12:00:00.000+08:00| 0.0| |
| |2021-07-01T12:00:01.000+08:00| 1.0| |
| |2021-07-01T12:00:02.000+08:00| 0.0| |
| |2021-07-01T12:00:03.000+08:00| 1.0| |
| |2021-07-01T12:00:04.000+08:00| 0.0| |
| |2021-07-01T12:00:05.000+08:00| 0.0| |
| |2021-07-01T12:00:06.000+08:00| 0.0| |
| |2021-07-01T12:00:07.000+08:00| 0.0| |
| |2021-07-01T12:00:08.000+08:00| 0.0| |
| |2021-07-01T12:00:09.000+08:00| 0.0| |
| |2021-07-01T12:00:10.000+08:00| 0.0| |
| |2021-07-01T12:00:11.000+08:00| 0.0| |
| |2021-07-01T12:00:12.000+08:00| 0.0| |
| |2021-07-01T12:00:13.000+08:00| 0.0| |
| |2021-07-01T12:00:14.000+08:00| 0.0| |
| |2021-07-01T12:00:15.000+08:00| 0.0| |
| |2021-07-01T12:00:16.000+08:00| 1.0| |
| |2021-07-01T12:00:17.000+08:00| 0.0| |
| |2021-07-01T12:00:18.000+08:00| 1.0| |
| |2021-07-01T12:00:19.000+08:00| 0.0| |
| |2021-07-01T12:00:20.000+08:00| 1.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> missdetect<span class="token punctuation">(</span>s2<span class="token punctuation">,</span><span class="token string">'minlen'</span><span class="token operator">=</span><span class="token string">'10'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------------+ |
| | Time|missdetect(root.test.d2.s2, "minlen"="10")| |
| +-----------------------------+------------------------------------------+ |
| |2021-07-01T12:00:00.000+08:00| false| |
| |2021-07-01T12:00:01.000+08:00| false| |
| |2021-07-01T12:00:02.000+08:00| false| |
| |2021-07-01T12:00:03.000+08:00| false| |
| |2021-07-01T12:00:04.000+08:00| true| |
| |2021-07-01T12:00:05.000+08:00| true| |
| |2021-07-01T12:00:06.000+08:00| true| |
| |2021-07-01T12:00:07.000+08:00| true| |
| |2021-07-01T12:00:08.000+08:00| true| |
| |2021-07-01T12:00:09.000+08:00| true| |
| |2021-07-01T12:00:10.000+08:00| true| |
| |2021-07-01T12:00:11.000+08:00| true| |
| |2021-07-01T12:00:12.000+08:00| true| |
| |2021-07-01T12:00:13.000+08:00| true| |
| |2021-07-01T12:00:14.000+08:00| true| |
| |2021-07-01T12:00:15.000+08:00| true| |
| |2021-07-01T12:00:16.000+08:00| false| |
| |2021-07-01T12:00:17.000+08:00| false| |
| |2021-07-01T12:00:18.000+08:00| false| |
| |2021-07-01T12:00:19.000+08:00| false| |
| |2021-07-01T12:00:20.000+08:00| false| |
| +-----------------------------+------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="range" tabindex="-1"><a class="header-anchor" href="#range" aria-hidden="true">#</a> Range</h4><h5 id="函数简介-33" tabindex="-1"><a class="header-anchor" href="#函数简介-33" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于查找时间序列的范围异常。将根据提供的上界与下界,判断输入数据是否越界,即异常,并输出所有异常点为新的时间序列。</p><p><strong>函数名:</strong> RANGE</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>lower_bound</code>:范围异常检测的下界。</li><li><code>upper_bound</code>:范围异常检测的上界。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型与输入序列相同。</p><p><strong>提示:</strong> 应满足<code>upper_bound</code>大于<code>lower_bound</code>,否则将不做输出。</p><h5 id="使用示例-38" tabindex="-1"><a class="header-anchor" href="#使用示例-38" aria-hidden="true">#</a> 使用示例</h5><h6 id="指定上界与下界" tabindex="-1"><a class="header-anchor" href="#指定上界与下界" aria-hidden="true">#</a> 指定上界与下界</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 120.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> range<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">"lower_bound"</span><span class="token operator">=</span><span class="token string">"101.0"</span><span class="token punctuation">,</span><span class="token string">"upper_bound"</span><span class="token operator">=</span><span class="token string">"125.0"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">00</span>:<span class="token number">30</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------------------------------------+ |
| |Time |range(root.test.d1.s1,"lower_bound"="101.0","upper_bound"="125.0")| |
| +-----------------------------+------------------------------------------------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| +-----------------------------+------------------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="twosidedfilter" tabindex="-1"><a class="header-anchor" href="#twosidedfilter" aria-hidden="true">#</a> TwoSidedFilter</h4><h5 id="函数简介-34" tabindex="-1"><a class="header-anchor" href="#函数简介-34" aria-hidden="true">#</a> 函数简介</h5><p>本函数基于双边窗口检测法对输入序列中的异常点进行过滤。</p><p><strong>函数名:</strong> TWOSIDEDFILTER</p><p><strong>输出序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>输出序列:</strong> 输出单个序列,类型与输入相同,是输入序列去除异常点后的结果。</p><p><strong>参数:</strong></p><ul><li><code>len</code>:双边窗口检测法中的窗口大小,取值范围为正整数,默认值为 5.如当<code>len</code>=3 时,算法向前、向后各取长度为3的窗口,在窗口中计算异常度。</li><li><code>threshold</code>:异常度的阈值,取值范围为(0,1),默认值为 0.3。阈值越高,函数对于异常度的判定标准越严格。</li></ul><h5 id="使用示例-39" tabindex="-1"><a class="header-anchor" href="#使用示例-39" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s0| |
| +-----------------------------+------------+ |
| |1970-01-01T08:00:00.000+08:00| 2002.0| |
| |1970-01-01T08:00:01.000+08:00| 1946.0| |
| |1970-01-01T08:00:02.000+08:00| 1958.0| |
| |1970-01-01T08:00:03.000+08:00| 2012.0| |
| |1970-01-01T08:00:04.000+08:00| 2051.0| |
| |1970-01-01T08:00:05.000+08:00| 1898.0| |
| |1970-01-01T08:00:06.000+08:00| 2014.0| |
| |1970-01-01T08:00:07.000+08:00| 2052.0| |
| |1970-01-01T08:00:08.000+08:00| 1935.0| |
| |1970-01-01T08:00:09.000+08:00| 1901.0| |
| |1970-01-01T08:00:10.000+08:00| 1972.0| |
| |1970-01-01T08:00:11.000+08:00| 1969.0| |
| |1970-01-01T08:00:12.000+08:00| 1984.0| |
| |1970-01-01T08:00:13.000+08:00| 2018.0| |
| |1970-01-01T08:00:37.000+08:00| 1484.0| |
| |1970-01-01T08:00:38.000+08:00| 1055.0| |
| |1970-01-01T08:00:39.000+08:00| 1050.0| |
| |1970-01-01T08:01:05.000+08:00| 1023.0| |
| |1970-01-01T08:01:06.000+08:00| 1056.0| |
| |1970-01-01T08:01:07.000+08:00| 978.0| |
| |1970-01-01T08:01:08.000+08:00| 1050.0| |
| |1970-01-01T08:01:09.000+08:00| 1123.0| |
| |1970-01-01T08:01:10.000+08:00| 1150.0| |
| |1970-01-01T08:01:11.000+08:00| 1034.0| |
| |1970-01-01T08:01:12.000+08:00| 950.0| |
| |1970-01-01T08:01:13.000+08:00| 1059.0| |
| +-----------------------------+------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> TwoSidedFilter<span class="token punctuation">(</span>s0<span class="token punctuation">,</span> <span class="token string">'len'</span><span class="token operator">=</span><span class="token string">'5'</span><span class="token punctuation">,</span> <span class="token string">'threshold'</span><span class="token operator">=</span><span class="token string">'0.3'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s0| |
| +-----------------------------+------------+ |
| |1970-01-01T08:00:00.000+08:00| 2002.0| |
| |1970-01-01T08:00:01.000+08:00| 1946.0| |
| |1970-01-01T08:00:02.000+08:00| 1958.0| |
| |1970-01-01T08:00:03.000+08:00| 2012.0| |
| |1970-01-01T08:00:04.000+08:00| 2051.0| |
| |1970-01-01T08:00:05.000+08:00| 1898.0| |
| |1970-01-01T08:00:06.000+08:00| 2014.0| |
| |1970-01-01T08:00:07.000+08:00| 2052.0| |
| |1970-01-01T08:00:08.000+08:00| 1935.0| |
| |1970-01-01T08:00:09.000+08:00| 1901.0| |
| |1970-01-01T08:00:10.000+08:00| 1972.0| |
| |1970-01-01T08:00:11.000+08:00| 1969.0| |
| |1970-01-01T08:00:12.000+08:00| 1984.0| |
| |1970-01-01T08:00:13.000+08:00| 2018.0| |
| |1970-01-01T08:01:05.000+08:00| 1023.0| |
| |1970-01-01T08:01:06.000+08:00| 1056.0| |
| |1970-01-01T08:01:07.000+08:00| 978.0| |
| |1970-01-01T08:01:08.000+08:00| 1050.0| |
| |1970-01-01T08:01:09.000+08:00| 1123.0| |
| |1970-01-01T08:01:10.000+08:00| 1150.0| |
| |1970-01-01T08:01:11.000+08:00| 1034.0| |
| |1970-01-01T08:01:12.000+08:00| 950.0| |
| |1970-01-01T08:01:13.000+08:00| 1059.0| |
| +-----------------------------+------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="outlier" tabindex="-1"><a class="header-anchor" href="#outlier" aria-hidden="true">#</a> Outlier</h4><h5 id="函数简介-35" tabindex="-1"><a class="header-anchor" href="#函数简介-35" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于检测基于距离的异常点。在当前窗口中,如果一个点距离阈值范围内的邻居数量(包括它自己)少于密度阈值,则该点是异常点。</p><p><strong>函数名:</strong> OUTLIER</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>r</code>:基于距离异常检测中的距离阈值。</li><li><code>k</code>:基于距离异常检测中的密度阈值。</li><li><code>w</code>:用于指定滑动窗口的大小。</li><li><code>s</code>:用于指定滑动窗口的步长。</li></ul><p><strong>输出序列</strong>:输出单个序列,类型与输入序列相同。</p><h5 id="使用示例-40" tabindex="-1"><a class="header-anchor" href="#使用示例-40" aria-hidden="true">#</a> 使用示例</h5><h6 id="指定查询参数" tabindex="-1"><a class="header-anchor" href="#指定查询参数" aria-hidden="true">#</a> 指定查询参数</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+ |
| | Time|root.test.s1| |
| +-----------------------------+------------+ |
| |2020-01-04T23:59:55.000+08:00| 56.0| |
| |2020-01-04T23:59:56.000+08:00| 55.1| |
| |2020-01-04T23:59:57.000+08:00| 54.2| |
| |2020-01-04T23:59:58.000+08:00| 56.3| |
| |2020-01-04T23:59:59.000+08:00| 59.0| |
| |2020-01-05T00:00:00.000+08:00| 60.0| |
| |2020-01-05T00:00:01.000+08:00| 60.5| |
| |2020-01-05T00:00:02.000+08:00| 64.5| |
| |2020-01-05T00:00:03.000+08:00| 69.0| |
| |2020-01-05T00:00:04.000+08:00| 64.2| |
| |2020-01-05T00:00:05.000+08:00| 62.3| |
| |2020-01-05T00:00:06.000+08:00| 58.0| |
| |2020-01-05T00:00:07.000+08:00| 58.9| |
| |2020-01-05T00:00:08.000+08:00| 52.0| |
| |2020-01-05T00:00:09.000+08:00| 62.3| |
| |2020-01-05T00:00:10.000+08:00| 61.0| |
| |2020-01-05T00:00:11.000+08:00| 64.2| |
| |2020-01-05T00:00:12.000+08:00| 61.8| |
| |2020-01-05T00:00:13.000+08:00| 64.0| |
| |2020-01-05T00:00:14.000+08:00| 63.0| |
| +-----------------------------+------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> outlier<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">"r"</span><span class="token operator">=</span><span class="token string">"5.0"</span><span class="token punctuation">,</span><span class="token string">"k"</span><span class="token operator">=</span><span class="token string">"4"</span><span class="token punctuation">,</span><span class="token string">"w"</span><span class="token operator">=</span><span class="token string">"10"</span><span class="token punctuation">,</span><span class="token string">"s"</span><span class="token operator">=</span><span class="token string">"5"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------------------------------------------+ |
| | Time|outlier(root.test.s1,"r"="5.0","k"="4","w"="10","s"="5")| |
| +-----------------------------+--------------------------------------------------------+ |
| |2020-01-05T00:00:03.000+08:00| 69.0| |
| +-----------------------------+--------------------------------------------------------+ |
| |2020-01-05T00:00:08.000+08:00| 52.0| |
| +-----------------------------+--------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="频域分析" tabindex="-1"><a class="header-anchor" href="#频域分析" aria-hidden="true">#</a> 频域分析</h3><h4 id="conv" tabindex="-1"><a class="header-anchor" href="#conv" aria-hidden="true">#</a> Conv</h4><h5 id="函数简介-36" tabindex="-1"><a class="header-anchor" href="#函数简介-36" aria-hidden="true">#</a> 函数简介</h5><p>本函数对两个输入序列进行卷积,即多项式乘法。</p><p><strong>函数名:</strong> CONV</p><p><strong>输入序列:</strong> 仅支持两个输入序列,类型均为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>输出序列:</strong> 输出单个序列,类型为DOUBLE,它是两个序列卷积的结果。序列的时间戳从0开始,仅用于表示顺序。</p><p><strong>提示:</strong> 输入序列中的<code>NaN</code>将被忽略。</p><h5 id="使用示例-41" tabindex="-1"><a class="header-anchor" href="#使用示例-41" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+---------------+ |
| | Time|root.test.d2.s1|root.test.d2.s2| |
| +-----------------------------+---------------+---------------+ |
| |1970-01-01T08:00:00.000+08:00| 1.0| 7.0| |
| |1970-01-01T08:00:00.001+08:00| 0.0| 2.0| |
| |1970-01-01T08:00:00.002+08:00| 1.0| null| |
| +-----------------------------+---------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> conv<span class="token punctuation">(</span>s1<span class="token punctuation">,</span>s2<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------------------------+ |
| | Time|conv(root.test.d2.s1, root.test.d2.s2)| |
| +-----------------------------+--------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 7.0| |
| |1970-01-01T08:00:00.001+08:00| 2.0| |
| |1970-01-01T08:00:00.002+08:00| 7.0| |
| |1970-01-01T08:00:00.003+08:00| 2.0| |
| +-----------------------------+--------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="deconv" tabindex="-1"><a class="header-anchor" href="#deconv" aria-hidden="true">#</a> Deconv</h4><h5 id="函数简介-37" tabindex="-1"><a class="header-anchor" href="#函数简介-37" aria-hidden="true">#</a> 函数简介</h5><p>本函数对两个输入序列进行去卷积,即多项式除法运算。</p><p><strong>函数名:</strong> DECONV</p><p><strong>输入序列:</strong> 仅支持两个输入序列,类型均为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>result</code>:去卷积的结果,取值为'quotient'或'remainder',分别对应于去卷积的商和余数。在缺省情况下,输出去卷积的商。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为DOUBLE。它是将第二个序列从第一个序列中去卷积(第一个序列除以第二个序列)的结果。序列的时间戳从0开始,仅用于表示顺序。</p><p><strong>提示:</strong> 输入序列中的<code>NaN</code>将被忽略。</p><h5 id="使用示例-42" tabindex="-1"><a class="header-anchor" href="#使用示例-42" aria-hidden="true">#</a> 使用示例</h5><h6 id="计算去卷积的商" tabindex="-1"><a class="header-anchor" href="#计算去卷积的商" aria-hidden="true">#</a> 计算去卷积的商</h6><p>当<code>result</code>参数缺省或为'quotient'时,本函数计算去卷积的商。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+---------------+ |
| | Time|root.test.d2.s3|root.test.d2.s2| |
| +-----------------------------+---------------+---------------+ |
| |1970-01-01T08:00:00.000+08:00| 8.0| 7.0| |
| |1970-01-01T08:00:00.001+08:00| 2.0| 2.0| |
| |1970-01-01T08:00:00.002+08:00| 7.0| null| |
| |1970-01-01T08:00:00.003+08:00| 2.0| null| |
| +-----------------------------+---------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> deconv<span class="token punctuation">(</span>s3<span class="token punctuation">,</span>s2<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+----------------------------------------+ |
| | Time|deconv(root.test.d2.s3, root.test.d2.s2)| |
| +-----------------------------+----------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 1.0| |
| |1970-01-01T08:00:00.001+08:00| 0.0| |
| |1970-01-01T08:00:00.002+08:00| 1.0| |
| +-----------------------------+----------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="计算去卷积的余数" tabindex="-1"><a class="header-anchor" href="#计算去卷积的余数" aria-hidden="true">#</a> 计算去卷积的余数</h6><p>当<code>result</code>参数为'remainder'时,本函数计算去卷积的余数。输入序列同上,用于查询的SQL语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> deconv<span class="token punctuation">(</span>s3<span class="token punctuation">,</span>s2<span class="token punctuation">,</span><span class="token string">'result'</span><span class="token operator">=</span><span class="token string">'remainder'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------------------------------------------------+ |
| | Time|deconv(root.test.d2.s3, root.test.d2.s2, "result"="remainder")| |
| +-----------------------------+--------------------------------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 1.0| |
| |1970-01-01T08:00:00.001+08:00| 0.0| |
| |1970-01-01T08:00:00.002+08:00| 0.0| |
| |1970-01-01T08:00:00.003+08:00| 0.0| |
| +-----------------------------+--------------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="dwt" tabindex="-1"><a class="header-anchor" href="#dwt" aria-hidden="true">#</a> DWT</h4><h5 id="函数简介-38" tabindex="-1"><a class="header-anchor" href="#函数简介-38" aria-hidden="true">#</a> 函数简介</h5><p>本函数对输入序列进行一维离散小波变换。</p><p><strong>函数名:</strong> DWT</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>method</code>:小波滤波的类型,提供'Haar', 'DB4', 'DB6', 'DB8',其中DB指代Daubechies。若不设置该参数,则用户需提供小波滤波的系数。不区分大小写。</li><li><code>coef</code>:小波滤波的系数。若提供该参数,请使用英文逗号','分割各项,不添加空格或其它符号。</li><li><code>layer</code>:进行变换的次数,最终输出的向量个数等同于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi><mi>a</mi><mi>y</mi><mi>e</mi><mi>r</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">layer+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.02778em;">yer</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>.默认取1。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为DOUBLE,长度与输入相等。</p><p><strong>提示:</strong> 输入序列长度必须为2的整数次幂。</p><h5 id="使用示例-43" tabindex="-1"><a class="header-anchor" href="#使用示例-43" aria-hidden="true">#</a> 使用示例</h5><h6 id="haar变换" tabindex="-1"><a class="header-anchor" href="#haar变换" aria-hidden="true">#</a> Haar变换</h6><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.0| |
| |1970-01-01T08:00:00.100+08:00| 0.2| |
| |1970-01-01T08:00:00.200+08:00| 1.5| |
| |1970-01-01T08:00:00.300+08:00| 1.2| |
| |1970-01-01T08:00:00.400+08:00| 0.6| |
| |1970-01-01T08:00:00.500+08:00| 1.7| |
| |1970-01-01T08:00:00.600+08:00| 0.8| |
| |1970-01-01T08:00:00.700+08:00| 2.0| |
| |1970-01-01T08:00:00.800+08:00| 2.5| |
| |1970-01-01T08:00:00.900+08:00| 2.1| |
| |1970-01-01T08:00:01.000+08:00| 0.0| |
| |1970-01-01T08:00:01.100+08:00| 2.0| |
| |1970-01-01T08:00:01.200+08:00| 1.8| |
| |1970-01-01T08:00:01.300+08:00| 1.2| |
| |1970-01-01T08:00:01.400+08:00| 1.0| |
| |1970-01-01T08:00:01.500+08:00| 1.6| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> dwt<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">"method"</span><span class="token operator">=</span><span class="token string">"haar"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------------------+ |
| | Time|dwt(root.test.d1.s1, "method"="haar")| |
| +-----------------------------+-------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.14142135834465192| |
| |1970-01-01T08:00:00.100+08:00| 1.909188342921157| |
| |1970-01-01T08:00:00.200+08:00| 1.6263456473052773| |
| |1970-01-01T08:00:00.300+08:00| 1.9798989957517026| |
| |1970-01-01T08:00:00.400+08:00| 3.252691126023161| |
| |1970-01-01T08:00:00.500+08:00| 1.414213562373095| |
| |1970-01-01T08:00:00.600+08:00| 2.1213203435596424| |
| |1970-01-01T08:00:00.700+08:00| 1.8384776479437628| |
| |1970-01-01T08:00:00.800+08:00| -0.14142135834465192| |
| |1970-01-01T08:00:00.900+08:00| 0.21213200063848547| |
| |1970-01-01T08:00:01.000+08:00| -0.7778174761639416| |
| |1970-01-01T08:00:01.100+08:00| -0.8485281289944873| |
| |1970-01-01T08:00:01.200+08:00| 0.2828427799095765| |
| |1970-01-01T08:00:01.300+08:00| -1.414213562373095| |
| |1970-01-01T08:00:01.400+08:00| 0.42426400127697095| |
| |1970-01-01T08:00:01.500+08:00| -0.42426408557066786| |
| +-----------------------------+-------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="fft" tabindex="-1"><a class="header-anchor" href="#fft" aria-hidden="true">#</a> FFT</h4><h5 id="函数简介-39" tabindex="-1"><a class="header-anchor" href="#函数简介-39" aria-hidden="true">#</a> 函数简介</h5><p>本函数对输入序列进行快速傅里叶变换。</p><p><strong>函数名:</strong> FFT</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>method</code>:傅里叶变换的类型,取值为'uniform'或'nonuniform',缺省情况下为'uniform'。当取值为'uniform'时,时间戳将被忽略,所有数据点都将被视作等距的,并应用等距快速傅里叶算法;当取值为'nonuniform'时,将根据时间戳应用非等距快速傅里叶算法(未实现)。</li><li><code>result</code>:傅里叶变换的结果,取值为'real'、'imag'、'abs'或'angle',分别对应于变换结果的实部、虚部、模和幅角。在缺省情况下,输出变换的模。</li><li><code>compress</code>:压缩参数,取值范围(0,1],是有损压缩时保留的能量比例。在缺省情况下,不进行压缩。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为DOUBLE,长度与输入相等。序列的时间戳从0开始,仅用于表示顺序。</p><p><strong>提示:</strong> 输入序列中的<code>NaN</code>将被忽略。</p><h5 id="使用示例-44" tabindex="-1"><a class="header-anchor" href="#使用示例-44" aria-hidden="true">#</a> 使用示例</h5><h6 id="等距傅里叶变换" tabindex="-1"><a class="header-anchor" href="#等距傅里叶变换" aria-hidden="true">#</a> 等距傅里叶变换</h6><p>当<code>type</code>参数缺省或为'uniform'时,本函数进行等距傅里叶变换。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |1970-01-01T08:00:00.000+08:00| 2.902113| |
| |1970-01-01T08:00:01.000+08:00| 1.1755705| |
| |1970-01-01T08:00:02.000+08:00| -2.1755705| |
| |1970-01-01T08:00:03.000+08:00| -1.9021131| |
| |1970-01-01T08:00:04.000+08:00| 1.0| |
| |1970-01-01T08:00:05.000+08:00| 1.9021131| |
| |1970-01-01T08:00:06.000+08:00| 0.1755705| |
| |1970-01-01T08:00:07.000+08:00| -1.1755705| |
| |1970-01-01T08:00:08.000+08:00| -0.902113| |
| |1970-01-01T08:00:09.000+08:00| 0.0| |
| |1970-01-01T08:00:10.000+08:00| 0.902113| |
| |1970-01-01T08:00:11.000+08:00| 1.1755705| |
| |1970-01-01T08:00:12.000+08:00| -0.1755705| |
| |1970-01-01T08:00:13.000+08:00| -1.9021131| |
| |1970-01-01T08:00:14.000+08:00| -1.0| |
| |1970-01-01T08:00:15.000+08:00| 1.9021131| |
| |1970-01-01T08:00:16.000+08:00| 2.1755705| |
| |1970-01-01T08:00:17.000+08:00| -1.1755705| |
| |1970-01-01T08:00:18.000+08:00| -2.902113| |
| |1970-01-01T08:00:19.000+08:00| 0.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> fft<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+----------------------+ |
| | Time| fft(root.test.d1.s1)| |
| +-----------------------------+----------------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.0| |
| |1970-01-01T08:00:00.001+08:00| 1.2727111142703152E-8| |
| |1970-01-01T08:00:00.002+08:00| 2.385520799101839E-7| |
| |1970-01-01T08:00:00.003+08:00| 8.723291723972645E-8| |
| |1970-01-01T08:00:00.004+08:00| 19.999999960195904| |
| |1970-01-01T08:00:00.005+08:00| 9.999999850988388| |
| |1970-01-01T08:00:00.006+08:00| 3.2260694930700566E-7| |
| |1970-01-01T08:00:00.007+08:00| 8.723291605373329E-8| |
| |1970-01-01T08:00:00.008+08:00| 1.108657103979944E-7| |
| |1970-01-01T08:00:00.009+08:00| 1.2727110997246171E-8| |
| |1970-01-01T08:00:00.010+08:00|1.9852334701272664E-23| |
| |1970-01-01T08:00:00.011+08:00| 1.2727111194499847E-8| |
| |1970-01-01T08:00:00.012+08:00| 1.108657103979944E-7| |
| |1970-01-01T08:00:00.013+08:00| 8.723291785769131E-8| |
| |1970-01-01T08:00:00.014+08:00| 3.226069493070057E-7| |
| |1970-01-01T08:00:00.015+08:00| 9.999999850988388| |
| |1970-01-01T08:00:00.016+08:00| 19.999999960195904| |
| |1970-01-01T08:00:00.017+08:00| 8.723291747109068E-8| |
| |1970-01-01T08:00:00.018+08:00| 2.3855207991018386E-7| |
| |1970-01-01T08:00:00.019+08:00| 1.2727112069910878E-8| |
| +-----------------------------+----------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注:输入序列服从<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>=</mo><mi>s</mi><mi>i</mi><mi>n</mi><mo stretchy="false">(</mo><mn>2</mn><mi>π</mi><mi>t</mi><mi mathvariant="normal">/</mi><mn>4</mn><mo stretchy="false">)</mo><mo>+</mo><mn>2</mn><mi>s</mi><mi>i</mi><mi>n</mi><mo stretchy="false">(</mo><mn>2</mn><mi>π</mi><mi>t</mi><mi mathvariant="normal">/</mi><mn>5</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">y=sin(2\pi t/4)+2sin(2\pi t/5)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mord mathnormal">in</span><span class="mopen">(</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">π</span><span class="mord mathnormal">t</span><span class="mord">/4</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mord mathnormal">s</span><span class="mord mathnormal">in</span><span class="mopen">(</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">π</span><span class="mord mathnormal">t</span><span class="mord">/5</span><span class="mclose">)</span></span></span></span>,长度为20,因此在输出序列中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi><mo>=</mo><mn>4</mn></mrow><annotation encoding="application/x-tex">k=4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">k=5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span>处有尖峰。</p><h6 id="等距傅里叶变换并压缩" tabindex="-1"><a class="header-anchor" href="#等距傅里叶变换并压缩" aria-hidden="true">#</a> 等距傅里叶变换并压缩</h6><p>输入序列同上,用于查询的SQL语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> fft<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">'result'</span><span class="token operator">=</span><span class="token string">'real'</span><span class="token punctuation">,</span> <span class="token string">'compress'</span><span class="token operator">=</span><span class="token string">'0.99'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> fft<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> <span class="token string">'result'</span><span class="token operator">=</span><span class="token string">'imag'</span><span class="token punctuation">,</span><span class="token string">'compress'</span><span class="token operator">=</span><span class="token string">'0.99'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+----------------------+----------------------+ |
| | Time| fft(root.test.d1.s1,| fft(root.test.d1.s1,| |
| | | "result"="real",| "result"="imag",| |
| | | "compress"="0.99")| "compress"="0.99")| |
| +-----------------------------+----------------------+----------------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.0| 0.0| |
| |1970-01-01T08:00:00.001+08:00| -3.932894010461041E-9| 1.2104201863039066E-8| |
| |1970-01-01T08:00:00.002+08:00|-1.4021739447490164E-7| 1.9299268669082926E-7| |
| |1970-01-01T08:00:00.003+08:00| -7.057291240286645E-8| 5.127422242345858E-8| |
| |1970-01-01T08:00:00.004+08:00| 19.021130288047125| -6.180339875198807| |
| |1970-01-01T08:00:00.005+08:00| 9.999999850988388| 3.501852745067114E-16| |
| |1970-01-01T08:00:00.019+08:00| -3.932894898639461E-9|-1.2104202549376264E-8| |
| +-----------------------------+----------------------+----------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注:基于傅里叶变换结果的共轭性质,压缩结果只保留前一半;根据给定的压缩参数,从低频到高频保留数据点,直到保留的能量比例超过该值;保留最后一个数据点以表示序列长度。</p><h4 id="highpass" tabindex="-1"><a class="header-anchor" href="#highpass" aria-hidden="true">#</a> HighPass</h4><h5 id="函数简介-40" tabindex="-1"><a class="header-anchor" href="#函数简介-40" aria-hidden="true">#</a> 函数简介</h5><p>本函数对输入序列进行高通滤波,提取高于截止频率的分量。输入序列的时间戳将被忽略,所有数据点都将被视作等距的。</p><p><strong>函数名:</strong> HIGHPASS</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>wpass</code>:归一化后的截止频率,取值为(0,1),不可缺省。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为DOUBLE,它是滤波后的序列,长度与时间戳均与输入一致。</p><p><strong>提示:</strong> 输入序列中的<code>NaN</code>将被忽略。</p><h5 id="使用示例-45" tabindex="-1"><a class="header-anchor" href="#使用示例-45" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |1970-01-01T08:00:00.000+08:00| 2.902113| |
| |1970-01-01T08:00:01.000+08:00| 1.1755705| |
| |1970-01-01T08:00:02.000+08:00| -2.1755705| |
| |1970-01-01T08:00:03.000+08:00| -1.9021131| |
| |1970-01-01T08:00:04.000+08:00| 1.0| |
| |1970-01-01T08:00:05.000+08:00| 1.9021131| |
| |1970-01-01T08:00:06.000+08:00| 0.1755705| |
| |1970-01-01T08:00:07.000+08:00| -1.1755705| |
| |1970-01-01T08:00:08.000+08:00| -0.902113| |
| |1970-01-01T08:00:09.000+08:00| 0.0| |
| |1970-01-01T08:00:10.000+08:00| 0.902113| |
| |1970-01-01T08:00:11.000+08:00| 1.1755705| |
| |1970-01-01T08:00:12.000+08:00| -0.1755705| |
| |1970-01-01T08:00:13.000+08:00| -1.9021131| |
| |1970-01-01T08:00:14.000+08:00| -1.0| |
| |1970-01-01T08:00:15.000+08:00| 1.9021131| |
| |1970-01-01T08:00:16.000+08:00| 2.1755705| |
| |1970-01-01T08:00:17.000+08:00| -1.1755705| |
| |1970-01-01T08:00:18.000+08:00| -2.902113| |
| |1970-01-01T08:00:19.000+08:00| 0.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> highpass<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'wpass'</span><span class="token operator">=</span><span class="token string">'0.45'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------------------------------+ |
| | Time|highpass(root.test.d1.s1, "wpass"="0.45")| |
| +-----------------------------+-----------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.9999999534830373| |
| |1970-01-01T08:00:01.000+08:00| 1.7462829277628608E-8| |
| |1970-01-01T08:00:02.000+08:00| -0.9999999593178128| |
| |1970-01-01T08:00:03.000+08:00| -4.1115269056426626E-8| |
| |1970-01-01T08:00:04.000+08:00| 0.9999999925494194| |
| |1970-01-01T08:00:05.000+08:00| 3.328126513330016E-8| |
| |1970-01-01T08:00:06.000+08:00| -1.0000000183304454| |
| |1970-01-01T08:00:07.000+08:00| 6.260191433311374E-10| |
| |1970-01-01T08:00:08.000+08:00| 1.0000000018134796| |
| |1970-01-01T08:00:09.000+08:00| -3.097210911744423E-17| |
| |1970-01-01T08:00:10.000+08:00| -1.0000000018134794| |
| |1970-01-01T08:00:11.000+08:00| -6.260191627862097E-10| |
| |1970-01-01T08:00:12.000+08:00| 1.0000000183304454| |
| |1970-01-01T08:00:13.000+08:00| -3.328126501424346E-8| |
| |1970-01-01T08:00:14.000+08:00| -0.9999999925494196| |
| |1970-01-01T08:00:15.000+08:00| 4.111526915498874E-8| |
| |1970-01-01T08:00:16.000+08:00| 0.9999999593178128| |
| |1970-01-01T08:00:17.000+08:00| -1.7462829341296528E-8| |
| |1970-01-01T08:00:18.000+08:00| -0.9999999534830369| |
| |1970-01-01T08:00:19.000+08:00| -1.035237222742873E-16| |
| +-----------------------------+-----------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注:输入序列服从<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>=</mo><mi>s</mi><mi>i</mi><mi>n</mi><mo stretchy="false">(</mo><mn>2</mn><mi>π</mi><mi>t</mi><mi mathvariant="normal">/</mi><mn>4</mn><mo stretchy="false">)</mo><mo>+</mo><mn>2</mn><mi>s</mi><mi>i</mi><mi>n</mi><mo stretchy="false">(</mo><mn>2</mn><mi>π</mi><mi>t</mi><mi mathvariant="normal">/</mi><mn>5</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">y=sin(2\pi t/4)+2sin(2\pi t/5)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mord mathnormal">in</span><span class="mopen">(</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">π</span><span class="mord mathnormal">t</span><span class="mord">/4</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mord mathnormal">s</span><span class="mord mathnormal">in</span><span class="mopen">(</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">π</span><span class="mord mathnormal">t</span><span class="mord">/5</span><span class="mclose">)</span></span></span></span>,长度为20,因此高通滤波之后的输出序列服从<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>=</mo><mi>s</mi><mi>i</mi><mi>n</mi><mo stretchy="false">(</mo><mn>2</mn><mi>π</mi><mi>t</mi><mi mathvariant="normal">/</mi><mn>4</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">y=sin(2\pi t/4)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mord mathnormal">in</span><span class="mopen">(</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">π</span><span class="mord mathnormal">t</span><span class="mord">/4</span><span class="mclose">)</span></span></span></span>。</p><h4 id="ifft" tabindex="-1"><a class="header-anchor" href="#ifft" aria-hidden="true">#</a> IFFT</h4><h5 id="函数简介-41" tabindex="-1"><a class="header-anchor" href="#函数简介-41" aria-hidden="true">#</a> 函数简介</h5><p>本函数将输入的两个序列作为实部和虚部视作一个复数,进行逆快速傅里叶变换,并输出结果的实部。输入数据的格式参见<code>FFT</code>函数的输出,并支持以<code>FFT</code>函数压缩后的输出作为本函数的输入。</p><p><strong>函数名:</strong> IFFT</p><p><strong>输入序列:</strong> 仅支持两个输入序列,类型均为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>start</code>:输出序列的起始时刻,是一个格式为'yyyy-MM-dd HH:mm:ss'的时间字符串。在缺省情况下,为'1970-01-01 08:00:00'。</li><li><code>interval</code>:输出序列的时间间隔,是一个有单位的正数。目前支持五种单位,分别是'ms'(毫秒)、's'(秒)、'm'(分钟)、'h'(小时)和'd'(天)。在缺省情况下,为1s。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为DOUBLE。该序列是一个等距时间序列,它的值是将两个输入序列依次作为实部和虚部进行逆快速傅里叶变换的结果。</p><p><strong>提示:</strong> 如果某行数据中包含空值或<code>NaN</code>,该行数据将会被忽略。</p><h5 id="使用示例-46" tabindex="-1"><a class="header-anchor" href="#使用示例-46" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+----------------------+----------------------+ |
| | Time| root.test.d1.re| root.test.d1.im| |
| +-----------------------------+----------------------+----------------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.0| 0.0| |
| |1970-01-01T08:00:00.001+08:00| -3.932894010461041E-9| 1.2104201863039066E-8| |
| |1970-01-01T08:00:00.002+08:00|-1.4021739447490164E-7| 1.9299268669082926E-7| |
| |1970-01-01T08:00:00.003+08:00| -7.057291240286645E-8| 5.127422242345858E-8| |
| |1970-01-01T08:00:00.004+08:00| 19.021130288047125| -6.180339875198807| |
| |1970-01-01T08:00:00.005+08:00| 9.999999850988388| 3.501852745067114E-16| |
| |1970-01-01T08:00:00.019+08:00| -3.932894898639461E-9|-1.2104202549376264E-8| |
| +-----------------------------+----------------------+----------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> ifft<span class="token punctuation">(</span>re<span class="token punctuation">,</span> im<span class="token punctuation">,</span> <span class="token string">'interval'</span><span class="token operator">=</span><span class="token string">'1m'</span><span class="token punctuation">,</span> <span class="token string">'start'</span><span class="token operator">=</span><span class="token string">'2021-01-01 00:00:00'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------------------------------------+ |
| | Time|ifft(root.test.d1.re, root.test.d1.im, "interval"="1m",| |
| | | "start"="2021-01-01 00:00:00")| |
| +-----------------------------+-------------------------------------------------------+ |
| |2021-01-01T00:00:00.000+08:00| 2.902112992431231| |
| |2021-01-01T00:01:00.000+08:00| 1.1755704705132448| |
| |2021-01-01T00:02:00.000+08:00| -2.175570513757101| |
| |2021-01-01T00:03:00.000+08:00| -1.9021130389094498| |
| |2021-01-01T00:04:00.000+08:00| 0.9999999925494194| |
| |2021-01-01T00:05:00.000+08:00| 1.902113046743454| |
| |2021-01-01T00:06:00.000+08:00| 0.17557053610884188| |
| |2021-01-01T00:07:00.000+08:00| -1.1755704886020932| |
| |2021-01-01T00:08:00.000+08:00| -0.9021130371347148| |
| |2021-01-01T00:09:00.000+08:00| 3.552713678800501E-16| |
| |2021-01-01T00:10:00.000+08:00| 0.9021130371347154| |
| |2021-01-01T00:11:00.000+08:00| 1.1755704886020932| |
| |2021-01-01T00:12:00.000+08:00| -0.17557053610884144| |
| |2021-01-01T00:13:00.000+08:00| -1.902113046743454| |
| |2021-01-01T00:14:00.000+08:00| -0.9999999925494196| |
| |2021-01-01T00:15:00.000+08:00| 1.9021130389094498| |
| |2021-01-01T00:16:00.000+08:00| 2.1755705137571004| |
| |2021-01-01T00:17:00.000+08:00| -1.1755704705132448| |
| |2021-01-01T00:18:00.000+08:00| -2.902112992431231| |
| |2021-01-01T00:19:00.000+08:00| -3.552713678800501E-16| |
| +-----------------------------+-------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="lowpass" tabindex="-1"><a class="header-anchor" href="#lowpass" aria-hidden="true">#</a> LowPass</h4><h5 id="函数简介-42" tabindex="-1"><a class="header-anchor" href="#函数简介-42" aria-hidden="true">#</a> 函数简介</h5><p>本函数对输入序列进行低通滤波,提取低于截止频率的分量。输入序列的时间戳将被忽略,所有数据点都将被视作等距的。</p><p><strong>函数名:</strong> LOWPASS</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>wpass</code>:归一化后的截止频率,取值为(0,1),不可缺省。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为DOUBLE,它是滤波后的序列,长度与时间戳均与输入一致。</p><p><strong>提示:</strong> 输入序列中的<code>NaN</code>将被忽略。</p><h5 id="使用示例-47" tabindex="-1"><a class="header-anchor" href="#使用示例-47" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s1| |
| +-----------------------------+---------------+ |
| |1970-01-01T08:00:00.000+08:00| 2.902113| |
| |1970-01-01T08:00:01.000+08:00| 1.1755705| |
| |1970-01-01T08:00:02.000+08:00| -2.1755705| |
| |1970-01-01T08:00:03.000+08:00| -1.9021131| |
| |1970-01-01T08:00:04.000+08:00| 1.0| |
| |1970-01-01T08:00:05.000+08:00| 1.9021131| |
| |1970-01-01T08:00:06.000+08:00| 0.1755705| |
| |1970-01-01T08:00:07.000+08:00| -1.1755705| |
| |1970-01-01T08:00:08.000+08:00| -0.902113| |
| |1970-01-01T08:00:09.000+08:00| 0.0| |
| |1970-01-01T08:00:10.000+08:00| 0.902113| |
| |1970-01-01T08:00:11.000+08:00| 1.1755705| |
| |1970-01-01T08:00:12.000+08:00| -0.1755705| |
| |1970-01-01T08:00:13.000+08:00| -1.9021131| |
| |1970-01-01T08:00:14.000+08:00| -1.0| |
| |1970-01-01T08:00:15.000+08:00| 1.9021131| |
| |1970-01-01T08:00:16.000+08:00| 2.1755705| |
| |1970-01-01T08:00:17.000+08:00| -1.1755705| |
| |1970-01-01T08:00:18.000+08:00| -2.902113| |
| |1970-01-01T08:00:19.000+08:00| 0.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> lowpass<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'wpass'</span><span class="token operator">=</span><span class="token string">'0.45'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+----------------------------------------+ |
| | Time|lowpass(root.test.d1.s1, "wpass"="0.45")| |
| +-----------------------------+----------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 1.9021130073323922| |
| |1970-01-01T08:00:01.000+08:00| 1.1755704705132448| |
| |1970-01-01T08:00:02.000+08:00| -1.1755705286582614| |
| |1970-01-01T08:00:03.000+08:00| -1.9021130389094498| |
| |1970-01-01T08:00:04.000+08:00| 7.450580419288145E-9| |
| |1970-01-01T08:00:05.000+08:00| 1.902113046743454| |
| |1970-01-01T08:00:06.000+08:00| 1.1755705212076808| |
| |1970-01-01T08:00:07.000+08:00| -1.1755704886020932| |
| |1970-01-01T08:00:08.000+08:00| -1.9021130222335536| |
| |1970-01-01T08:00:09.000+08:00| 3.552713678800501E-16| |
| |1970-01-01T08:00:10.000+08:00| 1.9021130222335536| |
| |1970-01-01T08:00:11.000+08:00| 1.1755704886020932| |
| |1970-01-01T08:00:12.000+08:00| -1.1755705212076801| |
| |1970-01-01T08:00:13.000+08:00| -1.902113046743454| |
| |1970-01-01T08:00:14.000+08:00| -7.45058112983088E-9| |
| |1970-01-01T08:00:15.000+08:00| 1.9021130389094498| |
| |1970-01-01T08:00:16.000+08:00| 1.1755705286582616| |
| |1970-01-01T08:00:17.000+08:00| -1.1755704705132448| |
| |1970-01-01T08:00:18.000+08:00| -1.9021130073323924| |
| |1970-01-01T08:00:19.000+08:00| -2.664535259100376E-16| |
| +-----------------------------+----------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注:输入序列服从<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>=</mo><mi>s</mi><mi>i</mi><mi>n</mi><mo stretchy="false">(</mo><mn>2</mn><mi>π</mi><mi>t</mi><mi mathvariant="normal">/</mi><mn>4</mn><mo stretchy="false">)</mo><mo>+</mo><mn>2</mn><mi>s</mi><mi>i</mi><mi>n</mi><mo stretchy="false">(</mo><mn>2</mn><mi>π</mi><mi>t</mi><mi mathvariant="normal">/</mi><mn>5</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">y=sin(2\pi t/4)+2sin(2\pi t/5)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">s</span><span class="mord mathnormal">in</span><span class="mopen">(</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">π</span><span class="mord mathnormal">t</span><span class="mord">/4</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mord mathnormal">s</span><span class="mord mathnormal">in</span><span class="mopen">(</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">π</span><span class="mord mathnormal">t</span><span class="mord">/5</span><span class="mclose">)</span></span></span></span>,长度为20,因此低通滤波之后的输出序列服从<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>=</mo><mn>2</mn><mi>s</mi><mi>i</mi><mi>n</mi><mo stretchy="false">(</mo><mn>2</mn><mi>π</mi><mi>t</mi><mi mathvariant="normal">/</mi><mn>5</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">y=2sin(2\pi t/5)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mord mathnormal">s</span><span class="mord mathnormal">in</span><span class="mopen">(</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.03588em;">π</span><span class="mord mathnormal">t</span><span class="mord">/5</span><span class="mclose">)</span></span></span></span>。</p><h3 id="数据匹配" tabindex="-1"><a class="header-anchor" href="#数据匹配" aria-hidden="true">#</a> 数据匹配</h3><h4 id="cov" tabindex="-1"><a class="header-anchor" href="#cov" aria-hidden="true">#</a> Cov</h4><h5 id="函数简介-43" tabindex="-1"><a class="header-anchor" href="#函数简介-43" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算两列数值型数据的总体协方差。</p><p><strong>函数名:</strong> COV</p><p><strong>输入序列:</strong> 仅支持两个输入序列,类型均为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE。序列仅包含一个时间戳为 0、值为总体协方差的数据点。</p><p><strong>提示:</strong></p><ul><li>如果某行数据中包含空值、缺失值或<code>NaN</code>,该行数据将会被忽略;</li><li>如果数据中所有的行都被忽略,函数将会输出<code>NaN</code>。</li></ul><h5 id="使用示例-48" tabindex="-1"><a class="header-anchor" href="#使用示例-48" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+---------------+ |
| | Time|root.test.d2.s1|root.test.d2.s2| |
| +-----------------------------+---------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| 101.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| null| |
| |2020-01-01T00:00:04.000+08:00| 102.0| 101.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| 102.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| 102.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| 103.0| |
| |2020-01-01T00:00:12.000+08:00| null| 103.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| 104.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| null| |
| |2020-01-01T00:00:16.000+08:00| 114.0| 104.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| 105.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| 105.0| |
| |2020-01-01T00:00:22.000+08:00| 100.0| 106.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| 108.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| 108.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| 108.0| |
| +-----------------------------+---------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> cov<span class="token punctuation">(</span>s1<span class="token punctuation">,</span>s2<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------------------+ |
| | Time|cov(root.test.d2.s1, root.test.d2.s2)| |
| +-----------------------------+-------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 12.291666666666666| |
| +-----------------------------+-------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="dtw" tabindex="-1"><a class="header-anchor" href="#dtw" aria-hidden="true">#</a> Dtw</h4><h5 id="函数简介-44" tabindex="-1"><a class="header-anchor" href="#函数简介-44" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算两列数值型数据的 DTW 距离。</p><p><strong>函数名:</strong> DTW</p><p><strong>输入序列:</strong> 仅支持两个输入序列,类型均为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE。序列仅包含一个时间戳为 0、值为两个时间序列的 DTW 距离值。</p><p><strong>提示:</strong></p><ul><li>如果某行数据中包含空值、缺失值或<code>NaN</code>,该行数据将会被忽略;</li><li>如果数据中所有的行都被忽略,函数将会输出 0。</li></ul><h5 id="使用示例-49" tabindex="-1"><a class="header-anchor" href="#使用示例-49" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+---------------+ |
| | Time|root.test.d2.s1|root.test.d2.s2| |
| +-----------------------------+---------------+---------------+ |
| |1970-01-01T08:00:00.001+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.002+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.003+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.004+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.005+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.006+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.007+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.008+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.009+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.010+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.011+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.012+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.013+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.014+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.015+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.016+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.017+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.018+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.019+08:00| 1.0| 2.0| |
| |1970-01-01T08:00:00.020+08:00| 1.0| 2.0| |
| +-----------------------------+---------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> dtw<span class="token punctuation">(</span>s1<span class="token punctuation">,</span>s2<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------------------+ |
| | Time|dtw(root.test.d2.s1, root.test.d2.s2)| |
| +-----------------------------+-------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 20.0| |
| +-----------------------------+-------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="pearson" tabindex="-1"><a class="header-anchor" href="#pearson" aria-hidden="true">#</a> Pearson</h4><h5 id="函数简介-45" tabindex="-1"><a class="header-anchor" href="#函数简介-45" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算两列数值型数据的皮尔森相关系数。</p><p><strong>函数名:</strong> PEARSON</p><p><strong>输入序列:</strong> 仅支持两个输入序列,类型均为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE。序列仅包含一个时间戳为 0、值为皮尔森相关系数的数据点。</p><p><strong>提示:</strong></p><ul><li>如果某行数据中包含空值、缺失值或<code>NaN</code>,该行数据将会被忽略;</li><li>如果数据中所有的行都被忽略,函数将会输出<code>NaN</code>。</li></ul><h5 id="使用示例-50" tabindex="-1"><a class="header-anchor" href="#使用示例-50" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+---------------+ |
| | Time|root.test.d2.s1|root.test.d2.s2| |
| +-----------------------------+---------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| 101.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| null| |
| |2020-01-01T00:00:04.000+08:00| 102.0| 101.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| 102.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| 102.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| 103.0| |
| |2020-01-01T00:00:12.000+08:00| null| 103.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| 104.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| null| |
| |2020-01-01T00:00:16.000+08:00| 114.0| 104.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| 105.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| 105.0| |
| |2020-01-01T00:00:22.000+08:00| 100.0| 106.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| 108.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| 108.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| 108.0| |
| +-----------------------------+---------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> pearson<span class="token punctuation">(</span>s1<span class="token punctuation">,</span>s2<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------------------------------+ |
| | Time|pearson(root.test.d2.s1, root.test.d2.s2)| |
| +-----------------------------+-----------------------------------------+ |
| |1970-01-01T08:00:00.000+08:00| 0.5630881927754872| |
| +-----------------------------+-----------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="ptnsym" tabindex="-1"><a class="header-anchor" href="#ptnsym" aria-hidden="true">#</a> PtnSym</h4><h5 id="函数简介-46" tabindex="-1"><a class="header-anchor" href="#函数简介-46" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于寻找序列中所有对称度小于阈值的对称子序列。对称度通过 DTW 计算,值越小代表序列对称性越高。</p><p><strong>函数名:</strong> PTNSYM</p><p><strong>输入序列:</strong> 仅支持一个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>window</code>:对称子序列的长度,是一个正整数,默认值为 10。</li><li><code>threshold</code>:对称度阈值,是一个非负数,只有对称度小于等于该值的对称子序列才会被输出。在缺省情况下,所有的子序列都会被输出。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE。序列中的每一个数据点对应于一个对称子序列,时间戳为子序列的起始时刻,值为对称度。</p><h5 id="使用示例-51" tabindex="-1"><a class="header-anchor" href="#使用示例-51" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d1.s4| |
| +-----------------------------+---------------+ |
| |2021-01-01T12:00:00.000+08:00| 1.0| |
| |2021-01-01T12:00:01.000+08:00| 2.0| |
| |2021-01-01T12:00:02.000+08:00| 3.0| |
| |2021-01-01T12:00:03.000+08:00| 2.0| |
| |2021-01-01T12:00:04.000+08:00| 1.0| |
| |2021-01-01T12:00:05.000+08:00| 1.0| |
| |2021-01-01T12:00:06.000+08:00| 1.0| |
| |2021-01-01T12:00:07.000+08:00| 1.0| |
| |2021-01-01T12:00:08.000+08:00| 2.0| |
| |2021-01-01T12:00:09.000+08:00| 3.0| |
| |2021-01-01T12:00:10.000+08:00| 2.0| |
| |2021-01-01T12:00:11.000+08:00| 1.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> ptnsym<span class="token punctuation">(</span>s4<span class="token punctuation">,</span> <span class="token string">'window'</span><span class="token operator">=</span><span class="token string">'5'</span><span class="token punctuation">,</span> <span class="token string">'threshold'</span><span class="token operator">=</span><span class="token string">'0'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------------------------+ |
| | Time|ptnsym(root.test.d1.s4, "window"="5", "threshold"="0")| |
| +-----------------------------+------------------------------------------------------+ |
| |2021-01-01T12:00:00.000+08:00| 0.0| |
| |2021-01-01T12:00:07.000+08:00| 0.0| |
| +-----------------------------+------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="xcorr" tabindex="-1"><a class="header-anchor" href="#xcorr" aria-hidden="true">#</a> XCorr</h4><h5 id="函数简介-47" tabindex="-1"><a class="header-anchor" href="#函数简介-47" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于计算两条时间序列的互相关函数值,<br> 对离散序列而言,互相关函数可以表示为</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>C</mi><mi>R</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mi>N</mi></mfrac><munderover><mo>∑</mo><mrow><mi>m</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><msub><mi>S</mi><mn>1</mn></msub><mo stretchy="false">[</mo><mi>m</mi><mo stretchy="false">]</mo><msub><mi>S</mi><mn>2</mn></msub><mo stretchy="false">[</mo><mi>m</mi><mo>+</mo><mi>n</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex"> CR(n) = \frac{1}{N} \sum_{m=1}^N S_1[m]S_2[m+n] </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">CR</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.0954em;vertical-align:-1.2671em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal">m</span><span class="mclose">]</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">n</span><span class="mclose">]</span></span></span></span></span></p><p>常用于表征两条序列在不同对齐条件下的相似度。</p><p><strong>函数名:</strong> XCORR</p><p><strong>输入序列:</strong> 仅支持两个输入序列,类型均为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>输出序列:</strong> 输出单个序列,类型为 DOUBLE。序列中共包含<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mi>N</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2N-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>个数据点,<br> 其中正中心的值为两条序列按照预先对齐的结果计算的互相关系数(即等于以上公式的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mi>R</mi><mo stretchy="false">(</mo><mn>0</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">CR(0)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">CR</span><span class="mopen">(</span><span class="mord">0</span><span class="mclose">)</span></span></span></span>),<br> 前半部分的值表示将后一条输入序列向前平移时计算的互相关系数,<br> 直至两条序列没有重合的数据点(不包含完全分离时的结果<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mi>R</mi><mo stretchy="false">(</mo><mo>−</mo><mi>N</mi><mo stretchy="false">)</mo><mo>=</mo><mn>0.0</mn></mrow><annotation encoding="application/x-tex">CR(-N)=0.0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">CR</span><span class="mopen">(</span><span class="mord">−</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0.0</span></span></span></span>),<br> 后半部分类似。<br> 用公式可表示为(所有序列的索引从1开始计数):</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>O</mi><mi>S</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo>=</mo><mi>C</mi><mi>R</mi><mo stretchy="false">(</mo><mo>−</mo><mi>N</mi><mo>+</mo><mi>i</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mi>N</mi></mfrac><munderover><mo>∑</mo><mrow><mi>m</mi><mo>=</mo><mn>1</mn></mrow><mi>i</mi></munderover><msub><mi>S</mi><mn>1</mn></msub><mo stretchy="false">[</mo><mi>m</mi><mo stretchy="false">]</mo><msub><mi>S</mi><mn>2</mn></msub><mo stretchy="false">[</mo><mi>N</mi><mo>−</mo><mi>i</mi><mo>+</mo><mi>m</mi><mo stretchy="false">]</mo><mo separator="true">,</mo><mtext> </mtext><mi>i</mi><mi>f</mi><mtext> </mtext><mi>i</mi><mo><</mo><mo>=</mo><mi>N</mi></mrow><annotation encoding="application/x-tex"> OS[i] = CR(-N+i) = \frac{1}{N} \sum_{m=1}^{i} S_1[m]S_2[N-i+m],\ if\ i <= N </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">OS</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">CR</span><span class="mopen">(</span><span class="mord">−</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">i</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.0788em;vertical-align:-1.2671em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8117em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal">m</span><span class="mclose">]</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7429em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">m</span><span class="mclose">]</span><span class="mpunct">,</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mspace"> </span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span></span></p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>O</mi><mi>S</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo>=</mo><mi>C</mi><mi>R</mi><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mi>N</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mi>N</mi></mfrac><munderover><mo>∑</mo><mrow><mi>m</mi><mo>=</mo><mn>1</mn></mrow><mrow><mn>2</mn><mi>N</mi><mo>−</mo><mi>i</mi></mrow></munderover><msub><mi>S</mi><mn>1</mn></msub><mo stretchy="false">[</mo><mi>i</mi><mo>−</mo><mi>N</mi><mo>+</mo><mi>m</mi><mo stretchy="false">]</mo><msub><mi>S</mi><mn>2</mn></msub><mo stretchy="false">[</mo><mi>m</mi><mo stretchy="false">]</mo><mo separator="true">,</mo><mtext> </mtext><mi>i</mi><mi>f</mi><mtext> </mtext><mi>i</mi><mo>></mo><mi>N</mi></mrow><annotation encoding="application/x-tex"> OS[i] = CR(i-N) = \frac{1}{N} \sum_{m=1}^{2N-i} S_1[i-N+m]S_2[m],\ if\ i > N </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">OS</span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mclose">]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">CR</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:3.0954em;vertical-align:-1.2671em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em;"><span style="top:-1.8829em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em;"><span class="pstrut" style="height:3.05em;"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em;"><span class="pstrut" style="height:3.05em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">m</span><span class="mclose">]</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">[</span><span class="mord mathnormal">m</span><span class="mclose">]</span><span class="mpunct">,</span><span class="mspace"> </span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mspace"> </span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span></span></p><p><strong>提示:</strong></p><ul><li>两条序列中的<code>null</code> 和<code>NaN</code> 值会被忽略,在计算中表现为 0。</li></ul><h5 id="使用示例-52" tabindex="-1"><a class="header-anchor" href="#使用示例-52" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+---------------+ |
| | Time|root.test.d1.s1|root.test.d1.s2| |
| +-----------------------------+---------------+---------------+ |
| |2020-01-01T00:00:01.000+08:00| null| 6| |
| |2020-01-01T00:00:02.000+08:00| 2| 7| |
| |2020-01-01T00:00:03.000+08:00| 3| NaN| |
| |2020-01-01T00:00:04.000+08:00| 4| 9| |
| |2020-01-01T00:00:05.000+08:00| 5| 10| |
| +-----------------------------+---------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> xcorr<span class="token punctuation">(</span>s1<span class="token punctuation">,</span> s2<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 <span class="token keyword">where</span> <span class="token keyword">time</span> <span class="token operator"><=</span> <span class="token number">2020</span><span class="token operator">-</span><span class="token number">01</span><span class="token operator">-</span><span class="token number">01</span> <span class="token number">00</span>:<span class="token number">00</span>:<span class="token number">05</span> |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------------------------------+ |
| | Time|xcorr(root.test.d1.s1, root.test.d1.s2)| |
| +-----------------------------+---------------------------------------+ |
| |1970-01-01T08:00:00.001+08:00| 0.0| |
| |1970-01-01T08:00:00.002+08:00| 4.0| |
| |1970-01-01T08:00:00.003+08:00| 9.6| |
| |1970-01-01T08:00:00.004+08:00| 13.4| |
| |1970-01-01T08:00:00.005+08:00| 20.0| |
| |1970-01-01T08:00:00.006+08:00| 15.6| |
| |1970-01-01T08:00:00.007+08:00| 9.2| |
| |1970-01-01T08:00:00.008+08:00| 11.8| |
| |1970-01-01T08:00:00.009+08:00| 6.0| |
| +-----------------------------+---------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="数据修复" tabindex="-1"><a class="header-anchor" href="#数据修复" aria-hidden="true">#</a> 数据修复</h3><h4 id="timestamprepair" tabindex="-1"><a class="header-anchor" href="#timestamprepair" aria-hidden="true">#</a> TimestampRepair</h4><h5 id="函数简介-48" tabindex="-1"><a class="header-anchor" href="#函数简介-48" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于时间戳修复。根据给定的标准时间间隔,采用最小化修复代价的方法,通过对数据时间戳的微调,将原本时间戳间隔不稳定的数据修复为严格等间隔的数据。在未给定标准时间间隔的情况下,本函数将使用时间间隔的中位数 (median)、众数 (mode) 或聚类中心 (cluster) 来推算标准时间间隔。</p><p><strong>函数名:</strong> TIMESTAMPREPAIR</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>interval</code>: 标准时间间隔(单位是毫秒),是一个正整数。在缺省情况下,将根据指定的方法推算。</li><li><code>method</code>:推算标准时间间隔的方法,取值为 'median', 'mode' 或 'cluster',仅在<code>interval</code>缺省时有效。在缺省情况下,将使用中位数方法进行推算。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型与输入序列相同。该序列是修复后的输入序列。</p><h5 id="使用示例-53" tabindex="-1"><a class="header-anchor" href="#使用示例-53" aria-hidden="true">#</a> 使用示例</h5><h6 id="指定标准时间间隔" tabindex="-1"><a class="header-anchor" href="#指定标准时间间隔" aria-hidden="true">#</a> 指定标准时间间隔</h6><p>在给定<code>interval</code>参数的情况下,本函数将按照指定的标准时间间隔进行修复。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d2.s1| |
| +-----------------------------+---------------+ |
| |2021-07-01T12:00:00.000+08:00| 1.0| |
| |2021-07-01T12:00:10.000+08:00| 2.0| |
| |2021-07-01T12:00:19.000+08:00| 3.0| |
| |2021-07-01T12:00:30.000+08:00| 4.0| |
| |2021-07-01T12:00:40.000+08:00| 5.0| |
| |2021-07-01T12:00:50.000+08:00| 6.0| |
| |2021-07-01T12:01:01.000+08:00| 7.0| |
| |2021-07-01T12:01:11.000+08:00| 8.0| |
| |2021-07-01T12:01:21.000+08:00| 9.0| |
| |2021-07-01T12:01:31.000+08:00| 10.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> timestamprepair<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'interval'</span><span class="token operator">=</span><span class="token string">'10000'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+----------------------------------------------------+ |
| | Time|timestamprepair(root.test.d2.s1, "interval"="10000")| |
| +-----------------------------+----------------------------------------------------+ |
| |2021-07-01T12:00:00.000+08:00| 1.0| |
| |2021-07-01T12:00:10.000+08:00| 2.0| |
| |2021-07-01T12:00:20.000+08:00| 3.0| |
| |2021-07-01T12:00:30.000+08:00| 4.0| |
| |2021-07-01T12:00:40.000+08:00| 5.0| |
| |2021-07-01T12:00:50.000+08:00| 6.0| |
| |2021-07-01T12:01:00.000+08:00| 7.0| |
| |2021-07-01T12:01:10.000+08:00| 8.0| |
| |2021-07-01T12:01:20.000+08:00| 9.0| |
| |2021-07-01T12:01:30.000+08:00| 10.0| |
| +-----------------------------+----------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="自动推算标准时间间隔" tabindex="-1"><a class="header-anchor" href="#自动推算标准时间间隔" aria-hidden="true">#</a> 自动推算标准时间间隔</h6><p>如果<code>interval</code>参数没有给定,本函数将按照推算的标准时间间隔进行修复。</p><p>输入序列同上,用于查询的 SQL 语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> timestamprepair<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------------------+ |
| | Time|timestamprepair(root.test.d2.s1)| |
| +-----------------------------+--------------------------------+ |
| |2021-07-01T12:00:00.000+08:00| 1.0| |
| |2021-07-01T12:00:10.000+08:00| 2.0| |
| |2021-07-01T12:00:20.000+08:00| 3.0| |
| |2021-07-01T12:00:30.000+08:00| 4.0| |
| |2021-07-01T12:00:40.000+08:00| 5.0| |
| |2021-07-01T12:00:50.000+08:00| 6.0| |
| |2021-07-01T12:01:00.000+08:00| 7.0| |
| |2021-07-01T12:01:10.000+08:00| 8.0| |
| |2021-07-01T12:01:20.000+08:00| 9.0| |
| |2021-07-01T12:01:30.000+08:00| 10.0| |
| +-----------------------------+--------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="valuefill" tabindex="-1"><a class="header-anchor" href="#valuefill" aria-hidden="true">#</a> ValueFill</h4><h5 id="函数简介-49" tabindex="-1"><a class="header-anchor" href="#函数简介-49" aria-hidden="true">#</a> 函数简介</h5><p><strong>函数名:</strong> ValueFill</p><p><strong>输入序列:</strong> 单列时序数据,类型为INT32 / INT64 / FLOAT / DOUBLE</p><p><strong>参数:</strong></p><ul><li><code>method</code>: {"mean", "previous", "linear", "likelihood", "AR", "MA", "SCREEN"}, 默认为 "linear"。其中,“mean” 指使用均值填补的方法; “previous" 指使用前值填补方法;“linear" 指使用线性插值填补方法;“likelihood” 为基于速度的正态分布的极大似然估计方法;“AR” 指自回归的填补方法;“MA” 指滑动平均的填补方法;"SCREEN" 指约束填补方法;缺省情况下使用 “linear”。</li></ul><p><strong>输出序列:</strong> 填补后的单维序列。</p><p><strong>备注:</strong> AR 模型采用 AR(1),时序列需满足自相关条件,否则将输出单个数据点 (0, 0.0).</p><h5 id="使用示例-54" tabindex="-1"><a class="header-anchor" href="#使用示例-54" aria-hidden="true">#</a> 使用示例</h5><h6 id="使用-linear-方法进行填补" tabindex="-1"><a class="header-anchor" href="#使用-linear-方法进行填补" aria-hidden="true">#</a> 使用 linear 方法进行填补</h6><p>当<code>method</code>缺省或取值为 'linear' 时,本函数将使用线性插值方法进行填补。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d2.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| NaN| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| NaN| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| NaN| |
| |2020-01-01T00:00:22.000+08:00| NaN| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| 128.0| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> valuefill<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-----------------------+ |
| | Time|valuefill(root.test.d2)| |
| +-----------------------------+-----------------------+ |
| |2020-01-01T00:00:02.000+08:00| NaN| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 108.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.7| |
| |2020-01-01T00:00:22.000+08:00| 121.3| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| 128.0| |
| +-----------------------------+-----------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="使用-previous-方法进行填补" tabindex="-1"><a class="header-anchor" href="#使用-previous-方法进行填补" aria-hidden="true">#</a> 使用 previous 方法进行填补</h6><p>当<code>method</code>取值为 'previous' 时,本函数将使前值填补方法进行数值填补。</p><p>输入序列同上,用于查询的 SQL 语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> valuefill<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">"method"</span><span class="token operator">=</span><span class="token string">"previous"</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------------------------+ |
| | Time|valuefill(root.test.d2,"method"="previous")| |
| +-----------------------------+-------------------------------------------+ |
| |2020-01-01T00:00:02.000+08:00| NaN| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 110.5| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 116.0| |
| |2020-01-01T00:00:22.000+08:00| 116.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| 128.0| |
| +-----------------------------+-------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="valuerepair" tabindex="-1"><a class="header-anchor" href="#valuerepair" aria-hidden="true">#</a> ValueRepair</h4><h5 id="函数简介-50" tabindex="-1"><a class="header-anchor" href="#函数简介-50" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于对时间序列的数值进行修复。目前,本函数支持两种修复方法:<strong>Screen</strong> 是一种基于速度阈值的方法,在最小改动的前提下使得所有的速度符合阈值要求;<strong>LsGreedy</strong> 是一种基于速度变化似然的方法,将速度变化建模为高斯分布,并采用贪心算法极大化似然函数。</p><p><strong>函数名:</strong> VALUEREPAIR</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>method</code>:修复时采用的方法,取值为 'Screen' 或 'LsGreedy'. 在缺省情况下,使用 Screen 方法进行修复。</li><li><code>minSpeed</code>:该参数仅在使用 Screen 方法时有效。当速度小于该值时会被视作数值异常点加以修复。在缺省情况下为中位数减去三倍绝对中位差。</li><li><code>maxSpeed</code>:该参数仅在使用 Screen 方法时有效。当速度大于该值时会被视作数值异常点加以修复。在缺省情况下为中位数加上三倍绝对中位差。</li><li><code>center</code>:该参数仅在使用 LsGreedy 方法时有效。对速度变化分布建立的高斯模型的中心。在缺省情况下为 0。</li><li><code>sigma</code> :该参数仅在使用 LsGreedy 方法时有效。对速度变化分布建立的高斯模型的标准差。在缺省情况下为绝对中位差。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型与输入序列相同。该序列是修复后的输入序列。</p><p><strong>提示:</strong> 输入序列中的<code>NaN</code>在修复之前会先进行线性插值填补。</p><h5 id="使用示例-55" tabindex="-1"><a class="header-anchor" href="#使用示例-55" aria-hidden="true">#</a> 使用示例</h5><h6 id="使用-screen-方法进行修复" tabindex="-1"><a class="header-anchor" href="#使用-screen-方法进行修复" aria-hidden="true">#</a> 使用 Screen 方法进行修复</h6><p>当<code>method</code>缺省或取值为 'Screen' 时,本函数将使用 Screen 方法进行数值修复。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d2.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 126.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 100.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| NaN| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> valuerepair<span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+----------------------------+ |
| | Time|valuerepair(root.test.d2.s1)| |
| +-----------------------------+----------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 106.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 120.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| 128.0| |
| +-----------------------------+----------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="使用-lsgreedy-方法进行修复" tabindex="-1"><a class="header-anchor" href="#使用-lsgreedy-方法进行修复" aria-hidden="true">#</a> 使用 LsGreedy 方法进行修复</h6><p>当<code>method</code>取值为 'LsGreedy' 时,本函数将使用 LsGreedy 方法进行数值修复。</p><p>输入序列同上,用于查询的 SQL 语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> valuerepair<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'method'</span><span class="token operator">=</span><span class="token string">'LsGreedy'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------------------------------+ |
| | Time|valuerepair(root.test.d2.s1, "method"="LsGreedy")| |
| +-----------------------------+-------------------------------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:03.000+08:00| 101.0| |
| |2020-01-01T00:00:04.000+08:00| 102.0| |
| |2020-01-01T00:00:06.000+08:00| 104.0| |
| |2020-01-01T00:00:08.000+08:00| 106.0| |
| |2020-01-01T00:00:10.000+08:00| 108.0| |
| |2020-01-01T00:00:14.000+08:00| 112.0| |
| |2020-01-01T00:00:15.000+08:00| 113.0| |
| |2020-01-01T00:00:16.000+08:00| 114.0| |
| |2020-01-01T00:00:18.000+08:00| 116.0| |
| |2020-01-01T00:00:20.000+08:00| 118.0| |
| |2020-01-01T00:00:22.000+08:00| 120.0| |
| |2020-01-01T00:00:26.000+08:00| 124.0| |
| |2020-01-01T00:00:28.000+08:00| 126.0| |
| |2020-01-01T00:00:30.000+08:00| 128.0| |
| +-----------------------------+-------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="masterrepair" tabindex="-1"><a class="header-anchor" href="#masterrepair" aria-hidden="true">#</a> MasterRepair</h4><h5 id="函数简介-51" tabindex="-1"><a class="header-anchor" href="#函数简介-51" aria-hidden="true">#</a> 函数简介</h5><p>本函数实现基于主数据的时间序列数据修复。</p><p>**函数名:**MasterRepair</p><p><strong>输入序列:</strong> 支持多个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>omega</code>:算法窗口大小,非负整数(单位为毫秒), 在缺省情况下,算法根据不同时间差下的两个元组距离自动估计该参数。</li><li><code>eta</code>:算法距离阈值,正数, 在缺省情况下,算法根据窗口中元组的距离分布自动估计该参数。</li><li><code>k</code>:主数据中的近邻数量,正整数, 在缺省情况下,算法根据主数据中的k个近邻的元组距离自动估计该参数。</li><li><code>output_column</code>:输出列的序号,默认输出第一列的修复结果。</li></ul><p>**输出序列:**输出单个序列,类型与输入数据中对应列的类型相同,序列为输入列修复后的结果。</p><h5 id="使用示例-56" tabindex="-1"><a class="header-anchor" href="#使用示例-56" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------+------------+------------+------------+------------+------------+ |
| | Time|root.test.t1|root.test.t2|root.test.t3|root.test.m1|root.test.m2|root.test.m3| |
| +-----------------------------+------------+------------+------------+------------+------------+------------+ |
| |2021-07-01T12:00:01.000+08:00| 1704| 1154.55| 0.195| 1704| 1154.55| 0.195| |
| |2021-07-01T12:00:02.000+08:00| 1702| 1152.30| 0.193| 1702| 1152.30| 0.193| |
| |2021-07-01T12:00:03.000+08:00| 1702| 1148.65| 0.192| 1702| 1148.65| 0.192| |
| |2021-07-01T12:00:04.000+08:00| 1701| 1145.20| 0.194| 1701| 1145.20| 0.194| |
| |2021-07-01T12:00:07.000+08:00| 1703| 1150.55| 0.195| 1703| 1150.55| 0.195| |
| |2021-07-01T12:00:08.000+08:00| 1694| 1151.55| 0.193| 1704| 1151.55| 0.193| |
| |2021-07-01T12:01:09.000+08:00| 1705| 1153.55| 0.194| 1705| 1153.55| 0.194| |
| |2021-07-01T12:01:10.000+08:00| 1706| 1152.30| 0.190| 1706| 1152.30| 0.190| |
| +-----------------------------+------------+------------+------------+------------+------------+------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的 SQL 语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> MasterRepair<span class="token punctuation">(</span>t1<span class="token punctuation">,</span>t2<span class="token punctuation">,</span>t3<span class="token punctuation">,</span>m1<span class="token punctuation">,</span>m2<span class="token punctuation">,</span>m3<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------------------------------------------------------------------------+ |
| | Time|MasterRepair(root.test.t1,root.test.t2,root.test.t3,root.test.m1,root.test.m2,root.test.m3)| |
| +-----------------------------+-------------------------------------------------------------------------------------------+ |
| |2021-07-01T12:00:01.000+08:00| 1704| |
| |2021-07-01T12:00:02.000+08:00| 1702| |
| |2021-07-01T12:00:03.000+08:00| 1702| |
| |2021-07-01T12:00:04.000+08:00| 1701| |
| |2021-07-01T12:00:07.000+08:00| 1703| |
| |2021-07-01T12:00:08.000+08:00| 1704| |
| |2021-07-01T12:01:09.000+08:00| 1705| |
| |2021-07-01T12:01:10.000+08:00| 1706| |
| +-----------------------------+-------------------------------------------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="seasonalrepair" tabindex="-1"><a class="header-anchor" href="#seasonalrepair" aria-hidden="true">#</a> SeasonalRepair</h4><h5 id="函数简介-52" tabindex="-1"><a class="header-anchor" href="#函数简介-52" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于对周期性时间序列的数值进行基于分解的修复。目前,本函数支持两种方法:<strong>Classical</strong>使用经典分解方法得到的残差项检测数值的异常波动,并使用滑动平均修复序列;<strong>Improved</strong>使用改进的分解方法得到的残差项检测数值的异常波动,并使用滑动中值修复序列。</p><p><strong>函数名:</strong> SEASONALREPAIR</p><p><strong>输入序列:</strong> 仅支持单个输入序列,类型为 INT32 / INT64 / FLOAT / DOUBLE。</p><p><strong>参数:</strong></p><ul><li><code>method</code>:修复时采用的分解方法,取值为'Classical'或'Improved'。在缺省情况下,使用经典分解方法进行修复。</li><li><code>period</code>:序列的周期。</li><li><code>k</code>:残差项的范围阈值,用来限制残差项偏离中心的程度。在缺省情况下为9。</li><li><code>max_iter</code>:算法的最大迭代次数。在缺省情况下为10。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型与输入序列相同。该序列是修复后的输入序列。</p><p><strong>提示:</strong> 输入序列中的<code>NaN</code>在修复之前会先进行线性插值填补。</p><h5 id="使用示例-57" tabindex="-1"><a class="header-anchor" href="#使用示例-57" aria-hidden="true">#</a> 使用示例</h5><h6 id="使用经典分解方法进行修复" tabindex="-1"><a class="header-anchor" href="#使用经典分解方法进行修复" aria-hidden="true">#</a> 使用经典分解方法进行修复</h6><p>当<code>method</code>缺省或取值为'Classical'时,本函数将使用经典分解方法进行数值修复。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+ |
| | Time|root.test.d2.s1| |
| +-----------------------------+---------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:04.000+08:00| 120.0| |
| |2020-01-01T00:00:06.000+08:00| 80.0| |
| |2020-01-01T00:00:08.000+08:00| 100.5| |
| |2020-01-01T00:00:10.000+08:00| 119.5| |
| |2020-01-01T00:00:12.000+08:00| 101.0| |
| |2020-01-01T00:00:14.000+08:00| 99.5| |
| |2020-01-01T00:00:16.000+08:00| 119.0| |
| |2020-01-01T00:00:18.000+08:00| 80.5| |
| |2020-01-01T00:00:20.000+08:00| 99.0| |
| |2020-01-01T00:00:22.000+08:00| 121.0| |
| |2020-01-01T00:00:24.000+08:00| 79.5| |
| +-----------------------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> seasonalrepair<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'period'</span><span class="token operator">=</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token string">'k'</span><span class="token operator">=</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------------------------------------+ |
| | Time|seasonalrepair(root.test.d2.s1, 'period'=4, 'k'=2)| |
| +-----------------------------+--------------------------------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:04.000+08:00| 120.0| |
| |2020-01-01T00:00:06.000+08:00| 80.0| |
| |2020-01-01T00:00:08.000+08:00| 100.5| |
| |2020-01-01T00:00:10.000+08:00| 119.5| |
| |2020-01-01T00:00:12.000+08:00| 87.0| |
| |2020-01-01T00:00:14.000+08:00| 99.5| |
| |2020-01-01T00:00:16.000+08:00| 119.0| |
| |2020-01-01T00:00:18.000+08:00| 80.5| |
| |2020-01-01T00:00:20.000+08:00| 99.0| |
| |2020-01-01T00:00:22.000+08:00| 121.0| |
| |2020-01-01T00:00:24.000+08:00| 79.5| |
| +-----------------------------+--------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="使用改进的分解方法进行修复" tabindex="-1"><a class="header-anchor" href="#使用改进的分解方法进行修复" aria-hidden="true">#</a> 使用改进的分解方法进行修复</h6><p>当<code>method</code>取值为'Improved'时,本函数将使用改进的分解方法进行数值修复。</p><p>输入序列同上,用于查询的SQL语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> seasonalrepair<span class="token punctuation">(</span>s1<span class="token punctuation">,</span><span class="token string">'method'</span><span class="token operator">=</span><span class="token string">'improved'</span><span class="token punctuation">,</span><span class="token string">'period'</span><span class="token operator">=</span><span class="token number">3</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d2 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+-------------------------------------------------------------+ |
| | Time|valuerepair(root.test.d2.s1, 'method'='improved', 'period'=3)| |
| +-----------------------------+-------------------------------------------------------------+ |
| |2020-01-01T00:00:02.000+08:00| 100.0| |
| |2020-01-01T00:00:04.000+08:00| 120.0| |
| |2020-01-01T00:00:06.000+08:00| 80.0| |
| |2020-01-01T00:00:08.000+08:00| 100.5| |
| |2020-01-01T00:00:10.000+08:00| 119.5| |
| |2020-01-01T00:00:12.000+08:00| 81.5| |
| |2020-01-01T00:00:14.000+08:00| 99.5| |
| |2020-01-01T00:00:16.000+08:00| 119.0| |
| |2020-01-01T00:00:18.000+08:00| 80.5| |
| |2020-01-01T00:00:20.000+08:00| 99.0| |
| |2020-01-01T00:00:22.000+08:00| 121.0| |
| |2020-01-01T00:00:24.000+08:00| 79.5| |
| +-----------------------------+-------------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="序列发现" tabindex="-1"><a class="header-anchor" href="#序列发现" aria-hidden="true">#</a> 序列发现</h3><h4 id="consecutivesequences" tabindex="-1"><a class="header-anchor" href="#consecutivesequences" aria-hidden="true">#</a> ConsecutiveSequences</h4><h5 id="函数简介-53" tabindex="-1"><a class="header-anchor" href="#函数简介-53" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于在多维严格等间隔数据中发现局部最长连续子序列。</p><p>严格等间隔数据是指数据的时间间隔是严格相等的,允许存在数据缺失(包括行缺失和值缺失),但不允许存在数据冗余和时间戳偏移。</p><p>连续子序列是指严格按照标准时间间隔等距排布,不存在任何数据缺失的子序列。如果某个连续子序列不是任何连续子序列的真子序列,那么它是局部最长的。</p><p><strong>函数名:</strong> CONSECUTIVESEQUENCES</p><p><strong>输入序列:</strong> 支持多个输入序列,类型可以是任意的,但要满足严格等间隔的要求。</p><p><strong>参数:</strong></p><ul><li><code>gap</code>:标准时间间隔,是一个有单位的正数。目前支持五种单位,分别是'ms'(毫秒)、's'(秒)、'm'(分钟)、'h'(小时)和'd'(天)。在缺省情况下,函数会利用众数估计标准时间间隔。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为 INT32。输出序列中的每一个数据点对应一个局部最长连续子序列,时间戳为子序列的起始时刻,值为子序列包含的数据点个数。</p><p><strong>提示:</strong> 对于不符合要求的输入,本函数不对输出做任何保证。</p><h5 id="使用示例-58" tabindex="-1"><a class="header-anchor" href="#使用示例-58" aria-hidden="true">#</a> 使用示例</h5><h6 id="手动指定标准时间间隔" tabindex="-1"><a class="header-anchor" href="#手动指定标准时间间隔" aria-hidden="true">#</a> 手动指定标准时间间隔</h6><p>本函数可以通过<code>gap</code>参数手动指定标准时间间隔。需要注意的是,错误的参数设置会导致输出产生严重错误。</p><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+---------------+ |
| | Time|root.test.d1.s1|root.test.d1.s2| |
| +-----------------------------+---------------+---------------+ |
| |2020-01-01T00:00:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:05:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:10:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:20:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:25:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:30:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:35:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:40:00.000+08:00| 1.0| null| |
| |2020-01-01T00:45:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:50:00.000+08:00| 1.0| 1.0| |
| +-----------------------------+---------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> consecutivesequences<span class="token punctuation">(</span>s1<span class="token punctuation">,</span>s2<span class="token punctuation">,</span><span class="token string">'gap'</span><span class="token operator">=</span><span class="token string">'5m'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------------------------------------+ |
| | Time|consecutivesequences(root.test.d1.s1, root.test.d1.s2, "gap"="5m")| |
| +-----------------------------+------------------------------------------------------------------+ |
| |2020-01-01T00:00:00.000+08:00| 3| |
| |2020-01-01T00:20:00.000+08:00| 4| |
| |2020-01-01T00:45:00.000+08:00| 2| |
| +-----------------------------+------------------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h6 id="自动估计标准时间间隔" tabindex="-1"><a class="header-anchor" href="#自动估计标准时间间隔" aria-hidden="true">#</a> 自动估计标准时间间隔</h6><p>当<code>gap</code>参数缺省时,本函数可以利用众数估计标准时间间隔,得到同样的结果。因此,这种用法更受推荐。</p><p>输入序列同上,用于查询的SQL语句如下:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> consecutivesequences<span class="token punctuation">(</span>s1<span class="token punctuation">,</span>s2<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+------------------------------------------------------+ |
| | Time|consecutivesequences(root.test.d1.s1, root.test.d1.s2)| |
| +-----------------------------+------------------------------------------------------+ |
| |2020-01-01T00:00:00.000+08:00| 3| |
| |2020-01-01T00:20:00.000+08:00| 4| |
| |2020-01-01T00:45:00.000+08:00| 2| |
| +-----------------------------+------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="consecutivewindows" tabindex="-1"><a class="header-anchor" href="#consecutivewindows" aria-hidden="true">#</a> ConsecutiveWindows</h4><h5 id="函数简介-54" tabindex="-1"><a class="header-anchor" href="#函数简介-54" aria-hidden="true">#</a> 函数简介</h5><p>本函数用于在多维严格等间隔数据中发现指定长度的连续窗口。</p><p>严格等间隔数据是指数据的时间间隔是严格相等的,允许存在数据缺失(包括行缺失和值缺失),但不允许存在数据冗余和时间戳偏移。</p><p>连续窗口是指严格按照标准时间间隔等距排布,不存在任何数据缺失的子序列。</p><p><strong>函数名:</strong> CONSECUTIVEWINDOWS</p><p><strong>输入序列:</strong> 支持多个输入序列,类型可以是任意的,但要满足严格等间隔的要求。</p><p><strong>参数:</strong></p><ul><li><code>gap</code>:标准时间间隔,是一个有单位的正数。目前支持五种单位,分别是 'ms'(毫秒)、's'(秒)、'm'(分钟)、'h'(小时)和'd'(天)。在缺省情况下,函数会利用众数估计标准时间间隔。</li><li><code>length</code>:序列长度,是一个有单位的正数。目前支持五种单位,分别是 'ms'(毫秒)、's'(秒)、'm'(分钟)、'h'(小时)和'd'(天)。该参数不允许缺省。</li></ul><p><strong>输出序列:</strong> 输出单个序列,类型为 INT32。输出序列中的每一个数据点对应一个指定长度连续子序列,时间戳为子序列的起始时刻,值为子序列包含的数据点个数。</p><p><strong>提示:</strong> 对于不符合要求的输入,本函数不对输出做任何保证。</p><h5 id="使用示例-59" tabindex="-1"><a class="header-anchor" href="#使用示例-59" aria-hidden="true">#</a> 使用示例</h5><p>输入序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+---------------+---------------+ |
| | Time|root.test.d1.s1|root.test.d1.s2| |
| +-----------------------------+---------------+---------------+ |
| |2020-01-01T00:00:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:05:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:10:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:20:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:25:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:30:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:35:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:40:00.000+08:00| 1.0| null| |
| |2020-01-01T00:45:00.000+08:00| 1.0| 1.0| |
| |2020-01-01T00:50:00.000+08:00| 1.0| 1.0| |
| +-----------------------------+---------------+---------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>用于查询的SQL语句:</p><div class="language-sql line-numbers-mode" data-ext="sql"><pre class="language-sql"><code><span class="token keyword">select</span> consecutivewindows<span class="token punctuation">(</span>s1<span class="token punctuation">,</span>s2<span class="token punctuation">,</span><span class="token string">'length'</span><span class="token operator">=</span><span class="token string">'10m'</span><span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>test<span class="token punctuation">.</span>d1 |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>输出序列:</p><div class="language-text line-numbers-mode" data-ext="text"><pre class="language-text"><code>+-----------------------------+--------------------------------------------------------------------+ |
| | Time|consecutivewindows(root.test.d1.s1, root.test.d1.s2, "length"="10m")| |
| +-----------------------------+--------------------------------------------------------------------+ |
| |2020-01-01T00:00:00.000+08:00| 3| |
| |2020-01-01T00:20:00.000+08:00| 3| |
| |2020-01-01T00:25:00.000+08:00| 3| |
| +-----------------------------+--------------------------------------------------------------------+ |
| </code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://github.com/apache/iotdb-docs/edit/main/src/zh/UserGuide/V1.2.x/User-Manuel/Database-Programming.md" rel="noopener noreferrer" target="_blank" aria-label="发现错误?在 GitHub 上编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewBox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->发现错误?在 GitHub 上编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><div class="meta-item git-info"><div class="update-time"><span class="label">上次编辑于: </span><!----></div><div class="contributors"><span class="label">贡献者: </span><!--[--><!--[--><span class="contributor" title="email: 43237967+2b3c511@users.noreply.github.com">Summer</span><!--]--><!--]--></div></div></footer><nav class="vp-page-nav"><a class="vp-link nav-link prev" href="/zh/UserGuide/V1.2.x/User-Manuel/Operator-and-Expression.html"><div class="hint"><span class="arrow start"></span>上一页</div><div class="link"><!---->运算符和表达式</div></a><a class="vp-link nav-link next" href="/zh/UserGuide/V1.2.x/User-Manuel/Authority-Management.html"><div class="hint">下一页<span class="arrow end"></span></div><div class="link">权限管理<!----></div></a></nav><!----><!----><!--]--></main><!--]--><footer style="padding-bottom:2rem;"><span id="doc-version" style="display:none;">rel/1.2</span><p style="text-align:center;color:#909399;font-size:12px;margin:0 30px;">Copyright © 2023 The Apache Software Foundation.<br> Apache and the Apache feather logo are trademarks of The Apache Software Foundation</p><p style="text-align:center;margin-top:10px;color:#909399;font-size:12px;margin:0 30px;"><strong>Have a question?</strong> Connect with us on QQ, WeChat, or Slack. <a href="https://github.com/apache/iotdb/issues/1995">Join the community</a> now.</p><p style="text-align:center;margin-top:10px;color:#909399;font-size:12px;margin:0 30px;"> We use <a href="https://analytics.google.com">Google Analytics</a> to collect anonymous, aggregated usage information. </p></footer></div><!--]--><!--]--><!----><!--]--></div> |
| <script type="module" src="/assets/app-83ad958f.js" defer></script> |
| </body> |
| </html> |