blob: ae089c7ad539acc904227d2d21a3a9bc332b93b2 [file] [log] [blame]
import{_ as o,c as p,b as l,d as s,a as e,w as d,e as t,r as i,o as r}from"./app-8RDGKaEm.js";const c={};function u(h,n){const a=i("RouteLink");return r(),p("div",null,[n[25]||(n[25]=l(`<h1 id="运算符、函数和表达式" tabindex="-1"><a class="header-anchor" href="#运算符、函数和表达式"><span>运算符、函数和表达式</span></a></h1><h2 id="运算符" tabindex="-1"><a class="header-anchor" href="#运算符"><span>运算符</span></a></h2><h3 id="算数运算符" tabindex="-1"><a class="header-anchor" href="#算数运算符"><span>算数运算符</span></a></h3><table><thead><tr><th>Operator</th><th>Meaning</th></tr></thead><tbody><tr><td><code>+</code></td><td>positive (unary operator)</td></tr><tr><td><code>-</code></td><td>negative (unary operator)</td></tr><tr><td><code>*</code></td><td>multiplication</td></tr><tr><td><code>/</code></td><td>division</td></tr><tr><td><code>%</code></td><td>modulo</td></tr><tr><td><code>+</code></td><td>addition</td></tr><tr><td><code>-</code></td><td>subtraction</td></tr></tbody></table><h3 id="比较运算符" tabindex="-1"><a class="header-anchor" href="#比较运算符"><span>比较运算符</span></a></h3><table><thead><tr><th>Operator</th><th>Meaning</th></tr></thead><tbody><tr><td><code>&gt;</code></td><td>greater than</td></tr><tr><td><code>&gt;=</code></td><td>greater than or equal to</td></tr><tr><td><code>&lt;</code></td><td>less than</td></tr><tr><td><code>&lt;=</code></td><td>less than or equal to</td></tr><tr><td><code>==</code></td><td>equal to</td></tr><tr><td><code>!=</code> / <code>&lt;&gt;</code></td><td>not equal to</td></tr><tr><td><code>BETWEEN ... AND ...</code></td><td>within the specified range</td></tr><tr><td><code>NOT BETWEEN ... AND ...</code></td><td>not within the specified range</td></tr><tr><td><code>LIKE</code></td><td>match simple pattern</td></tr><tr><td><code>NOT LIKE</code></td><td>cannot match simple pattern</td></tr><tr><td><code>REGEXP</code></td><td>match regular expression</td></tr><tr><td><code>NOT REGEXP</code></td><td>cannot match regular expression</td></tr><tr><td><code>IS NULL</code></td><td>is null</td></tr><tr><td><code>IS NOT NULL</code></td><td>is not null</td></tr><tr><td><code>IN</code> / <code>CONTAINS</code></td><td>is a value in the specified list</td></tr><tr><td><code>NOT IN</code> / <code>NOT CONTAINS</code></td><td>is not a value in the specified list</td></tr></tbody></table><h3 id="逻辑运算符" tabindex="-1"><a class="header-anchor" href="#逻辑运算符"><span>逻辑运算符</span></a></h3><table><thead><tr><th>Operator</th><th>Meaning</th></tr></thead><tbody><tr><td><code>NOT</code> / <code>!</code></td><td>logical negation (unary operator)</td></tr><tr><td><code>AND</code> / <code>&amp;</code> / <code>&amp;&amp;</code></td><td>logical AND</td></tr><tr><td><code>OR</code>/ | / ||</td><td>logical OR</td></tr></tbody></table><h3 id="运算符优先级" tabindex="-1"><a class="header-anchor" href="#运算符优先级"><span>运算符优先级</span></a></h3><p>运算符的优先级从高到低排列如下,同一行的运算符优先级相同。</p><div class="language-sql line-numbers-mode" data-highlighter="prismjs" data-ext="sql" data-title="sql"><pre><code><span class="line"><span class="token operator">!</span><span class="token punctuation">,</span> <span class="token operator">-</span> <span class="token punctuation">(</span>unary operator<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">+</span> <span class="token punctuation">(</span>unary operator<span class="token punctuation">)</span></span>
<span class="line"><span class="token operator">*</span><span class="token punctuation">,</span> <span class="token operator">/</span><span class="token punctuation">,</span> <span class="token operator">DIV</span><span class="token punctuation">,</span> <span class="token operator">%</span><span class="token punctuation">,</span> MOD</span>
<span class="line"><span class="token operator">-</span><span class="token punctuation">,</span> <span class="token operator">+</span></span>
<span class="line"><span class="token operator">=</span><span class="token punctuation">,</span> <span class="token operator">=</span><span class="token operator">=</span><span class="token punctuation">,</span> <span class="token operator">&lt;=&gt;</span><span class="token punctuation">,</span> <span class="token operator">&gt;=</span><span class="token punctuation">,</span> <span class="token operator">&gt;</span><span class="token punctuation">,</span> <span class="token operator">&lt;=</span><span class="token punctuation">,</span> <span class="token operator">&lt;</span><span class="token punctuation">,</span> <span class="token operator">&lt;&gt;</span><span class="token punctuation">,</span> <span class="token operator">!=</span></span>
<span class="line"><span class="token operator">LIKE</span><span class="token punctuation">,</span> <span class="token operator">REGEXP</span><span class="token punctuation">,</span> <span class="token operator">NOT</span> <span class="token operator">LIKE</span><span class="token punctuation">,</span> <span class="token operator">NOT</span> <span class="token operator">REGEXP</span></span>
<span class="line"><span class="token operator">BETWEEN</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token operator">AND</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> <span class="token operator">NOT</span> <span class="token operator">BETWEEN</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token operator">AND</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
<span class="line"><span class="token operator">IS</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span> <span class="token operator">IS</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span></span>
<span class="line"><span class="token operator">IN</span><span class="token punctuation">,</span> <span class="token keyword">CONTAINS</span><span class="token punctuation">,</span> <span class="token operator">NOT</span> <span class="token operator">IN</span><span class="token punctuation">,</span> <span class="token operator">NOT</span> <span class="token keyword">CONTAINS</span></span>
<span class="line"><span class="token operator">AND</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span><span class="token punctuation">,</span> <span class="token operator">&amp;&amp;</span></span>
<span class="line"><span class="token operator">OR</span><span class="token punctuation">,</span> <span class="token operator">|</span><span class="token punctuation">,</span> <span class="token operator">||</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="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><h2 id="内置函数" tabindex="-1"><a class="header-anchor" href="#内置函数"><span>内置函数</span></a></h2><p>列表中的函数无须注册即可在 IoTDB 中使用,数据函数质量库中的函数需要参考注册步骤进行注册后才能使用。</p><h3 id="聚合函数" tabindex="-1"><a class="header-anchor" href="#聚合函数"><span>聚合函数</span></a></h3><table><thead><tr><th>函数名</th><th>功能描述</th><th>允许的输入类型</th><th>输出类型</th></tr></thead><tbody><tr><td>SUM</td><td>求和。</td><td>INT32 INT64 FLOAT DOUBLE</td><td>DOUBLE</td></tr><tr><td>COUNT</td><td>计算数据点数。</td><td>所有类型</td><td>INT</td></tr><tr><td>AVG</td><td>求平均值。</td><td>INT32 INT64 FLOAT DOUBLE</td><td>DOUBLE</td></tr><tr><td>EXTREME</td><td>求具有最大绝对值的值。如果正值和负值的最大绝对值相等,则返回正值。</td><td>INT32 INT64 FLOAT DOUBLE</td><td>与输入类型一致</td></tr><tr><td>MAX_VALUE</td><td>求最大值。</td><td>INT32 INT64 FLOAT DOUBLE</td><td>与输入类型一致</td></tr><tr><td>MIN_VALUE</td><td>求最小值。</td><td>INT32 INT64 FLOAT DOUBLE</td><td>与输入类型一致</td></tr><tr><td>FIRST_VALUE</td><td>求时间戳最小的值。</td><td>所有类型</td><td>与输入类型一致</td></tr><tr><td>LAST_VALUE</td><td>求时间戳最大的值。</td><td>所有类型</td><td>与输入类型一致</td></tr><tr><td>MAX_TIME</td><td>求最大时间戳。</td><td>所有类型</td><td>Timestamp</td></tr><tr><td>MIN_TIME</td><td>求最小时间戳。</td><td>所有类型</td><td>Timestamp</td></tr></tbody></table><h3 id="数学函数" tabindex="-1"><a class="header-anchor" href="#数学函数"><span>数学函数</span></a></h3><table><thead><tr><th>函数名</th><th>输入序列类型</th><th>输出序列类型</th><th>必要属性参数</th><th>Java 标准库中的对应实现</th></tr></thead><tbody><tr><td>SIN</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#sin(double)</td></tr><tr><td>COS</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#cos(double)</td></tr><tr><td>TAN</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#tan(double)</td></tr><tr><td>ASIN</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#asin(double)</td></tr><tr><td>ACOS</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#acos(double)</td></tr><tr><td>ATAN</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#atan(double)</td></tr><tr><td>SINH</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#sinh(double)</td></tr><tr><td>COSH</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#cosh(double)</td></tr><tr><td>TANH</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#tanh(double)</td></tr><tr><td>DEGREES</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#toDegrees(double)</td></tr><tr><td>RADIANS</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#toRadians(double)</td></tr><tr><td>ABS</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>与输入序列的实际类型一致</td><td></td><td>Math#abs(int) / Math#abs(long) /Math#abs(float) /Math#abs(double)</td></tr><tr><td>SIGN</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#signum(double)</td></tr><tr><td>CEIL</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#ceil(double)</td></tr><tr><td>FLOOR</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#floor(double)</td></tr><tr><td>ROUND</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td><code>places</code>:四舍五入有效位数,正数为小数点后面的有效位数,负数为整数位的有效位数</td><td>Math#rint(Math#pow(10,places))/Math#pow(10,places)</td></tr><tr><td>EXP</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#exp(double)</td></tr><tr><td>LN</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#log(double)</td></tr><tr><td>LOG10</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#log10(double)</td></tr><tr><td>SQRT</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>DOUBLE</td><td></td><td>Math#sqrt(double)</td></tr></tbody></table><h3 id="比较函数" tabindex="-1"><a class="header-anchor" href="#比较函数"><span>比较函数</span></a></h3><table><thead><tr><th>函数名</th><th>可接收的输入序列类型</th><th>必要的属性参数</th><th>输出序列类型</th><th>功能类型</th></tr></thead><tbody><tr><td>ON_OFF</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td><code>threshold</code>:DOUBLE</td><td>BOOLEAN</td><td>返回<code>ts_value &gt;= threshold</code>的bool值</td></tr><tr><td>IN_RANGE</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td><code>lower</code>:DOUBLE<br><code>upper</code>:DOUBLE</td><td>BOOLEAN</td><td>返回<code>ts_value &gt;= lower &amp;&amp; ts_value &lt;= upper</code>的bool值</td></tr></tbody></table><h3 id="字符串函数" tabindex="-1"><a class="header-anchor" href="#字符串函数"><span>字符串函数</span></a></h3><table><thead><tr><th>函数名</th><th>输入序列类型</th><th>必要的属性参数</th><th>输出序列类型</th><th>功能描述</th></tr></thead><tbody><tr><td>STRING_CONTAINS</td><td>TEXT</td><td><code>s</code>: 待搜寻的字符串</td><td>BOOLEAN</td><td>判断字符串中是否存在<code>s</code></td></tr><tr><td>STRING_MATCHES</td><td>TEXT</td><td><code>regex</code>: Java 标准库风格的正则表达式</td><td>BOOLEAN</td><td>判断字符串是否能够被正则表达式<code>regex</code>匹配</td></tr><tr><td>LENGTH</td><td>TEXT</td><td>无</td><td>INT32</td><td>返回字符串的长度</td></tr><tr><td>LOCATE</td><td>TEXT</td><td><code>target</code>: 需要被定位的子串 <br> <code>reverse</code>: 指定是否需要倒序定位,默认值为<code>false</code>, 即从左至右定位</td><td>INT32</td><td>获取<code>target</code>子串第一次出现在输入序列的位置,如果输入序列中不包含<code>target</code>则返回 -1</td></tr><tr><td>STARTSWITH</td><td>TEXT</td><td><code>target</code>: 需要匹配的前缀</td><td>BOOLEAN</td><td>判断字符串是否有指定前缀</td></tr><tr><td>ENDSWITH</td><td>TEXT</td><td><code>target</code>: 需要匹配的后缀</td><td>BOOLEAN</td><td>判断字符串是否有指定后缀</td></tr><tr><td>CONCAT</td><td>TEXT</td><td><code>targets</code>: 一系列 K-V, key需要以<code>target</code>为前缀且不重复, value是待拼接的字符串。<br><code>series_behind</code>: 指定拼接时时间序列是否在后面,默认为<code>false</code>。</td><td>TEXT</td><td>拼接字符串和<code>target</code>字串</td></tr><tr><td>SUBSTRING</td><td>TEXT</td><td><code>from</code>: 指定子串开始下标 <br><code>for</code>: 指定的字符个数之后停止</td><td>TEXT</td><td>提取字符串的子字符串,从指定的第一个字符开始,并在指定的字符数之后停止。下标从1开始。from for的范围是 INT32 类型取值范围。</td></tr><tr><td>REPLACE</td><td>TEXT</td><td>第一个参数: 需要替换的目标子串<br>第二个参数:要替换成的子串</td><td>TEXT</td><td>将输入序列中的子串替换成目标子串</td></tr><tr><td>UPPER</td><td>TEXT</td><td>无</td><td>TEXT</td><td>将字符串转化为大写</td></tr><tr><td>LOWER</td><td>TEXT</td><td>无</td><td>TEXT</td><td>将字符串转化为小写</td></tr><tr><td>TRIM</td><td>TEXT</td><td>无</td><td>TEXT</td><td>移除字符串前后的空格</td></tr><tr><td>STRCMP</td><td>TEXT</td><td>无</td><td>TEXT</td><td>用于比较两个输入序列,如果值相同返回 <code>0</code> , 序列1的值小于序列2的值返回一个<code>负数</code>,序列1的值大于序列2的值返回一个<code>正数</code></td></tr></tbody></table><h3 id="数据类型转换函数" tabindex="-1"><a class="header-anchor" href="#数据类型转换函数"><span>数据类型转换函数</span></a></h3><table><thead><tr><th>函数名</th><th>必要的属性参数</th><th>输出序列类型</th><th>功能类型</th></tr></thead><tbody><tr><td>CAST</td><td><code>type</code>:输出的数据点的类型,只能是 INT32 / INT64 / FLOAT / DOUBLE / BOOLEAN / TEXT</td><td>由输入属性参数<code>type</code>决定</td><td>将数据转换为<code>type</code>参数指定的类型。</td></tr></tbody></table><h3 id="常序列生成函数" tabindex="-1"><a class="header-anchor" href="#常序列生成函数"><span>常序列生成函数</span></a></h3><table><thead><tr><th>函数名</th><th>必要的属性参数</th><th>输出序列类型</th><th>功能描述</th></tr></thead><tbody><tr><td>CONST</td><td><code>value</code>: 输出的数据点的值 <br><code>type</code>: 输出的数据点的类型,只能是 INT32 / INT64 / FLOAT / DOUBLE / BOOLEAN / TEXT</td><td>由输入属性参数 <code>type</code> 决定</td><td>根据输入属性 <code>value</code> <code>type</code> 输出用户指定的常序列。</td></tr><tr><td>PI</td><td>无</td><td>DOUBLE</td><td>常序列的值:<code>π</code> 的 <code>double</code> 值,圆的周长与其直径的比值,即圆周率,等于 <em>Java标准库</em> 中的<code>Math.PI</code>。</td></tr><tr><td>E</td><td>无</td><td>DOUBLE</td><td>常序列的值:<code>e</code> <code>double</code> 值,自然对数的底,它等于 <em>Java 标准库</em> 中的 <code>Math.E</code>。</td></tr></tbody></table><h3 id="选择函数" tabindex="-1"><a class="header-anchor" href="#选择函数"><span>选择函数</span></a></h3><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><h3 id="区间查询函数" tabindex="-1"><a class="header-anchor" href="#区间查询函数"><span>区间查询函数</span></a></h3><table><thead><tr><th>函数名</th><th>输入序列类型</th><th>属性参数</th><th>输出序列类型</th><th>功能描述</th></tr></thead><tbody><tr><td>ZERO_DURATION</td><td>INT32/ INT64/ FLOAT/ DOUBLE/ BOOLEAN</td><td><code>min</code>:可选,默认值0<br><code>max</code>:可选,默认值<code>Long.MAX_VALUE</code></td><td>Long</td><td>返回时间序列连续为0(false)的开始时间与持续时间,持续时间t(单位ms)满足<code>t &gt;= min &amp;&amp; t &lt;= max</code></td></tr><tr><td>NON_ZERO_DURATION</td><td>INT32/ INT64/ FLOAT/ DOUBLE/ BOOLEAN</td><td><code>min</code>:可选,默认值0<br><code>max</code>:可选,默认值<code>Long.MAX_VALUE</code></td><td>Long</td><td>返回时间序列连续不为0(false)的开始时间与持续时间,持续时间t(单位ms)满足<code>t &gt;= min &amp;&amp; t &lt;= max</code></td></tr><tr><td>ZERO_COUNT</td><td>INT32/ INT64/ FLOAT/ DOUBLE/ BOOLEAN</td><td><code>min</code>:可选,默认值1<br><code>max</code>:可选,默认值<code>Long.MAX_VALUE</code></td><td>Long</td><td>返回时间序列连续为0(false)的开始时间与其后数据点的个数,数据点个数n满足<code>n &gt;= min &amp;&amp; n &lt;= max</code></td></tr><tr><td>NON_ZERO_COUNT</td><td>INT32/ INT64/ FLOAT/ DOUBLE/ BOOLEAN</td><td><code>min</code>:可选,默认值1<br><code>max</code>:可选,默认值<code>Long.MAX_VALUE</code></td><td>Long</td><td>返回时间序列连续不为0(false)的开始时间与其后数据点的个数,数据点个数n满足<code>n &gt;= min &amp;&amp; n &lt;= max</code></td></tr></tbody></table><h3 id="趋势计算函数" tabindex="-1"><a class="header-anchor" href="#趋势计算函数"><span>趋势计算函数</span></a></h3><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><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><h3 id="采样函数" tabindex="-1"><a class="header-anchor" href="#采样函数"><span>采样函数</span></a></h3><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><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><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><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><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><h3 id="时间序列处理函数" tabindex="-1"><a class="header-anchor" href="#时间序列处理函数"><span>时间序列处理函数</span></a></h3><table><thead><tr><th>函数名</th><th>输入序列类型</th><th>参数</th><th>输出序列类型</th><th>功能描述</th></tr></thead><tbody><tr><td>CHANGE_POINTS</td><td>INT32 / INT64 / FLOAT / DOUBLE</td><td>/</td><td>与输入序列的实际类型一致</td><td>去除输入序列中的连续相同值</td></tr></tbody></table><h2 id="数据质量函数库" tabindex="-1"><a class="header-anchor" href="#数据质量函数库"><span>数据质量函数库</span></a></h2><h3 id="关于" tabindex="-1"><a class="header-anchor" href="#关于"><span>关于</span></a></h3><p>对基于时序数据的应用而言,数据质量至关重要。基于用户自定义函数能力,IoTDB 提供了一系列关于数据质量的函数,包括数据画像、数据质量评估与修复等,能够满足工业领域对数据质量的需求。</p><h3 id="快速上手" tabindex="-1"><a class="header-anchor" href="#快速上手"><span>快速上手</span></a></h3><p><strong>该函数库中的函数不是内置函数,使用前要先加载到系统中。</strong> 操作流程如下:</p><ol><li>下载包含全部依赖的 jar 包和注册脚本 <a href="https://archive.apache.org/dist/iotdb/1.0.1/apache-iotdb-1.0.1-library-udf-bin.zip" target="_blank" rel="noopener noreferrer">【点击下载】</a> ;</li><li>将 jar 包复制到 IoTDB 程序目录的 <code>ext\\udf</code> 目录下 (若您使用的是集群,请将jar包复制到所有DataNode的该目录下);</li><li>启动 IoTDB;</li><li>将注册脚本复制到 IoTDB 的程序目录下(与<code>sbin</code>目录同级的根目录下),修改脚本中的参数(如果需要)并运行注册脚本以注册 UDF。</li></ol><h3 id="已经实现的函数" tabindex="-1"><a class="header-anchor" href="#已经实现的函数"><span>已经实现的函数</span></a></h3>`,43)),s("ol",null,[s("li",null,[e(a,{to:"/zh/UserGuide/V1.2.x/Reference/UDF-Libraries.html#%E6%95%B0%E6%8D%AE%E8%B4%A8%E9%87%8F"},{default:d(()=>n[0]||(n[0]=[t("Data-Quality")])),_:1}),n[1]||(n[1]=t(" 数据质量"))]),s("li",null,[e(a,{to:"/zh/UserGuide/V1.2.x/Reference/UDF-Libraries.html#%E6%95%B0%E6%8D%AE%E7%94%BB%E5%83%8F"},{default:d(()=>n[2]||(n[2]=[t("Data-Profiling")])),_:1}),n[3]||(n[3]=t(" 数据画像"))]),s("li",null,[e(a,{to:"/zh/UserGuide/V1.2.x/Reference/UDF-Libraries.html#%E5%BC%82%E5%B8%B8%E6%A3%80%E6%B5%8B"},{default:d(()=>n[4]||(n[4]=[t("Anomaly-Detection")])),_:1}),n[5]||(n[5]=t(" 异常检测"))]),s("li",null,[e(a,{to:"/zh/UserGuide/V1.2.x/Reference/UDF-Libraries.html#%E9%A2%91%E5%9F%9F%E5%88%86%E6%9E%90"},{default:d(()=>n[6]||(n[6]=[t("Frequency-Domain")])),_:1}),n[7]||(n[7]=t(" 频域分析"))]),s("li",null,[e(a,{to:"/zh/UserGuide/V1.2.x/Reference/UDF-Libraries.html#%E6%95%B0%E6%8D%AE%E5%8C%B9%E9%85%8D"},{default:d(()=>n[8]||(n[8]=[t("Data-Matching")])),_:1}),n[9]||(n[9]=t(" 数据匹配"))]),s("li",null,[e(a,{to:"/zh/UserGuide/V1.2.x/Reference/UDF-Libraries.html#%E6%95%B0%E6%8D%AE%E4%BF%AE%E5%A4%8D"},{default:d(()=>n[10]||(n[10]=[t("Data-Repairing")])),_:1}),n[11]||(n[11]=t(" 数据修复"))]),s("li",null,[e(a,{to:"/zh/UserGuide/V1.2.x/Reference/UDF-Libraries.html#%E5%BA%8F%E5%88%97%E5%8F%91%E7%8E%B0"},{default:d(()=>n[12]||(n[12]=[t("Series-Discovery")])),_:1}),n[13]||(n[13]=t(" 序列发现"))]),s("li",null,[e(a,{to:"/zh/UserGuide/V1.2.x/Reference/UDF-Libraries.html#%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0"},{default:d(()=>n[14]||(n[14]=[t("Machine-Learning")])),_:1}),n[15]||(n[15]=t(" 机器学习"))])]),n[26]||(n[26]=l(`<h2 id="lambda-表达式" tabindex="-1"><a class="header-anchor" href="#lambda-表达式"><span>Lambda 表达式</span></a></h2><table><thead><tr><th>函数名</th><th>可接收的输入序列类型</th><th>必要的属性参数</th><th>输出序列类型</th><th>功能类型</th></tr></thead><tbody><tr><td>JEXL</td><td>INT32 / INT64 / FLOAT / DOUBLE / TEXT / BOOLEAN</td><td><code>expr</code>是一个支持标准的一元或多元参数的lambda表达式,符合<code>x -&gt; {...}</code>或<code>(x, y, z) -&gt; {...}</code>的格式,例如<code>x -&gt; {x * 2}</code>, <code>(x, y, z) -&gt; {x + y * z}</code></td><td>INT32 / INT64 / FLOAT / DOUBLE / TEXT / BOOLEAN</td><td>返回将输入的时间序列通过lambda表达式变换的序列</td></tr></tbody></table><h2 id="条件表达式" tabindex="-1"><a class="header-anchor" href="#条件表达式"><span>条件表达式</span></a></h2><table><thead><tr><th>表达式名称</th><th>含义</th></tr></thead><tbody><tr><td><code>CASE</code></td><td>类似if else</td></tr></tbody></table><h2 id="select-表达式" tabindex="-1"><a class="header-anchor" href="#select-表达式"><span>SELECT 表达式</span></a></h2><p><code>SELECT</code> 子句指定查询的输出,由若干个 <code>selectExpr</code> 组成。 每个 <code>selectExpr</code> 定义了查询结果中的一列或多列。</p><p><strong><code>selectExpr</code> 是一个由时间序列路径后缀、常量、函数和运算符组成的表达式。即 <code>selectExpr</code> 中可以包含:</strong></p><ul><li>时间序列路径后缀(支持使用通配符)</li><li>运算符 <ul><li>算数运算符</li><li>比较运算符</li><li>逻辑运算符</li></ul></li><li>函数 <ul><li>聚合函数</li><li>时间序列生成函数(包括内置函数和用户自定义函数)</li></ul></li><li>常量</li></ul><h4 id="使用别名" tabindex="-1"><a class="header-anchor" href="#使用别名"><span>使用别名</span></a></h4><p>由于 IoTDB 独特的数据模型,在每个传感器前都附带有设备等诸多额外信息。有时,我们只针对某个具体设备查询,而这些前缀信息频繁显示造成了冗余,影响了结果集的显示与分析。</p><p>IoTDB 支持使用<code>AS</code>为查询结果集中的列指定别名。</p><p><strong>示例:</strong></p><div class="language-sql line-numbers-mode" data-highlighter="prismjs" data-ext="sql" data-title="sql"><pre><code><span class="line"><span class="token keyword">select</span> s1 <span class="token keyword">as</span> temperature<span class="token punctuation">,</span> s2 <span class="token keyword">as</span> speed <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></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>结果集将显示为:</p><table><thead><tr><th>Time</th><th>temperature</th><th>speed</th></tr></thead><tbody><tr><td>...</td><td>...</td><td>...</td></tr></tbody></table><h4 id="运算符-1" tabindex="-1"><a class="header-anchor" href="#运算符-1"><span>运算符</span></a></h4>`,16)),s("p",null,[n[17]||(n[17]=t("IoTDB 中支持的运算符列表见文档 ")),e(a,{to:"/zh/UserGuide/V1.2.x/User-Manual/Operator-and-Expression.html"},{default:d(()=>n[16]||(n[16]=[t("运算符和函数")])),_:1}),n[18]||(n[18]=t(""))]),n[27]||(n[27]=l(`<h4 id="函数" tabindex="-1"><a class="header-anchor" href="#函数"><span>函数</span></a></h4><h5 id="聚合函数-1" tabindex="-1"><a class="header-anchor" href="#聚合函数-1"><span>聚合函数</span></a></h5><p>聚合函数是多对一函数。它们对一组值进行聚合计算,得到单个聚合结果。</p><p><strong>包含聚合函数的查询称为聚合查询</strong>,否则称为时间序列查询。</p><p><strong>注意:聚合查询和时间序列查询不能混合使用。</strong> 下列语句是不支持的:</p><div class="language-sql line-numbers-mode" data-highlighter="prismjs" data-ext="sql" data-title="sql"><pre><code><span class="line"><span class="token keyword">select</span> s1<span class="token punctuation">,</span> <span class="token function">count</span><span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">.</span>d1<span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">select</span> sin<span class="token punctuation">(</span>s1<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">count</span><span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">.</span>d1<span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">select</span> s1<span class="token punctuation">,</span> <span class="token function">count</span><span class="token punctuation">(</span>s1<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">.</span>d1 <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">10</span><span class="token punctuation">,</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token number">10</span>ms<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><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="#时间序列生成函数"><span>时间序列生成函数</span></a></h5><p>时间序列生成函数接受若干原始时间序列作为输入,产生一列时间序列输出。与聚合函数不同的是,时间序列生成函数的结果集带有时间戳列。</p><p>所有的时间序列生成函数都可以接受 * 作为输入,都可以与原始时间序列查询混合进行。</p><h6 id="内置时间序列生成函数" tabindex="-1"><a class="header-anchor" href="#内置时间序列生成函数"><span>内置时间序列生成函数</span></a></h6>`,10)),s("p",null,[n[20]||(n[20]=t("IoTDB 中支持的内置函数列表见文档 ")),e(a,{to:"/zh/UserGuide/V1.2.x/User-Manual/Operator-and-Expression.html"},{default:d(()=>n[19]||(n[19]=[t("运算符和函数")])),_:1}),n[21]||(n[21]=t("。"))]),n[28]||(n[28]=s("h6",{id:"自定义时间序列生成函数",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#自定义时间序列生成函数"},[s("span",null,"自定义时间序列生成函数")])],-1)),s("p",null,[n[23]||(n[23]=t("IoTDB 支持通过用户自定义函数(点击查看: ")),e(a,{to:"/zh/UserGuide/V1.2.x/User-Manual/Database-Programming.html#%E7%94%A8%E6%88%B7%E8%87%AA%E5%AE%9A%E4%B9%89%E5%87%BD%E6%95%B0"},{default:d(()=>n[22]||(n[22]=[t("用户自定义函数")])),_:1}),n[24]||(n[24]=t(" )能力进行函数功能扩展。"))]),n[29]||(n[29]=l(`<h4 id="嵌套表达式举例" tabindex="-1"><a class="header-anchor" href="#嵌套表达式举例"><span>嵌套表达式举例</span></a></h4><p>IoTDB 支持嵌套表达式,由于聚合查询和时间序列查询不能在一条查询语句中同时出现,我们将支持的嵌套表达式分为时间序列查询嵌套表达式和聚合查询嵌套表达式两类。</p><h5 id="时间序列查询嵌套表达式" tabindex="-1"><a class="header-anchor" href="#时间序列查询嵌套表达式"><span>时间序列查询嵌套表达式</span></a></h5><p>IoTDB 支持在 <code>SELECT</code> 子句中计算由<strong>时间序列、常量、时间序列生成函数(包括用户自定义函数)和运算符</strong>组成的任意嵌套表达式。</p><p><strong>说明:</strong></p><ul><li>当某个时间戳下左操作数和右操作数都不为空(<code>null</code>)时,表达式才会有结果,否则表达式值为<code>null</code>,且默认不出现在结果集中。</li><li>如果表达式中某个操作数对应多条时间序列(如通配符 <code>*</code>),那么每条时间序列对应的结果都会出现在结果集中(按照笛卡尔积形式)。</li></ul><p><strong>示例 1:</strong></p><div class="language-sql line-numbers-mode" data-highlighter="prismjs" data-ext="sql" data-title="sql"><pre><code><span class="line"><span class="token keyword">select</span> a<span class="token punctuation">,</span></span>
<span class="line"> b<span class="token punctuation">,</span></span>
<span class="line"> <span class="token punctuation">(</span><span class="token punctuation">(</span>a <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">2</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token number">2</span> <span class="token operator">+</span> <span class="token number">1.5</span><span class="token punctuation">,</span></span>
<span class="line"> sin<span class="token punctuation">(</span>a <span class="token operator">+</span> sin<span class="token punctuation">(</span>a <span class="token operator">+</span> sin<span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line"> <span class="token operator">-</span><span class="token punctuation">(</span>a <span class="token operator">+</span> b<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token punctuation">(</span>sin<span class="token punctuation">(</span>a <span class="token operator">+</span> b<span class="token punctuation">)</span> <span class="token operator">*</span> sin<span class="token punctuation">(</span>a <span class="token operator">+</span> b<span class="token punctuation">)</span> <span class="token operator">+</span> cos<span class="token punctuation">(</span>a <span class="token operator">+</span> b<span class="token punctuation">)</span> <span class="token operator">*</span> cos<span class="token punctuation">(</span>a <span class="token operator">+</span> b<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span></span>
<span class="line"><span class="token keyword">from</span> root<span class="token punctuation">.</span>sg1<span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="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><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">+-----------------------------+----------+----------+----------------------------------------+---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+</span>
<span class="line">| Time|root.sg1.a|root.sg1.b|((((root.sg1.a + 1) * 2) - 1) % 2) + 1.5|sin(root.sg1.a + sin(root.sg1.a + sin(root.sg1.b)))|(-root.sg1.a + root.sg1.b * ((sin(root.sg1.a + root.sg1.b) * sin(root.sg1.a + root.sg1.b)) + (cos(root.sg1.a + root.sg1.b) * cos(root.sg1.a + root.sg1.b)))) + 1|</span>
<span class="line">+-----------------------------+----------+----------+----------------------------------------+---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+</span>
<span class="line">|1970-01-01T08:00:00.010+08:00| 1| 1| 2.5| 0.9238430524420609| -1.0|</span>
<span class="line">|1970-01-01T08:00:00.020+08:00| 2| 2| 2.5| 0.7903505371876317| -3.0|</span>
<span class="line">|1970-01-01T08:00:00.030+08:00| 3| 3| 2.5| 0.14065207680386618| -5.0|</span>
<span class="line">|1970-01-01T08:00:00.040+08:00| 4| null| 2.5| null| null|</span>
<span class="line">|1970-01-01T08:00:00.050+08:00| null| 5| null| null| null|</span>
<span class="line">|1970-01-01T08:00:00.060+08:00| 6| 6| 2.5| -0.7288037411970916| -11.0|</span>
<span class="line">+-----------------------------+----------+----------+----------------------------------------+---------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+</span>
<span class="line">Total line number = 6</span>
<span class="line">It costs 0.048s</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="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><div class="language-sql line-numbers-mode" data-highlighter="prismjs" data-ext="sql" data-title="sql"><pre><code><span class="line"><span class="token keyword">select</span> <span class="token punctuation">(</span>a <span class="token operator">+</span> b<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">2</span> <span class="token operator">+</span> sin<span class="token punctuation">(</span>a<span class="token punctuation">)</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>sg</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>运行结果:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">+-----------------------------+----------------------------------------------+</span>
<span class="line">| Time|((root.sg.a + root.sg.b) * 2) + sin(root.sg.a)|</span>
<span class="line">+-----------------------------+----------------------------------------------+</span>
<span class="line">|1970-01-01T08:00:00.010+08:00| 59.45597888911063|</span>
<span class="line">|1970-01-01T08:00:00.020+08:00| 100.91294525072763|</span>
<span class="line">|1970-01-01T08:00:00.030+08:00| 139.01196837590714|</span>
<span class="line">|1970-01-01T08:00:00.040+08:00| 180.74511316047935|</span>
<span class="line">|1970-01-01T08:00:00.050+08:00| 219.73762514629607|</span>
<span class="line">|1970-01-01T08:00:00.060+08:00| 259.6951893788978|</span>
<span class="line">|1970-01-01T08:00:00.070+08:00| 300.7738906815579|</span>
<span class="line">|1970-01-01T08:00:00.090+08:00| 39.45597888911063|</span>
<span class="line">|1970-01-01T08:00:00.100+08:00| 39.45597888911063|</span>
<span class="line">+-----------------------------+----------------------------------------------+</span>
<span class="line">Total line number = 9</span>
<span class="line">It costs 0.011s</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="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>示例 3:</strong></p><div class="language-sql line-numbers-mode" data-highlighter="prismjs" data-ext="sql" data-title="sql"><pre><code><span class="line"><span class="token keyword">select</span> <span class="token punctuation">(</span>a <span class="token operator">+</span> <span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>sg1</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>运行结果:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">+-----------------------------+-----------------------------+-----------------------------+</span>
<span class="line">| Time|(root.sg1.a + root.sg1.a) / 2|(root.sg1.a + root.sg1.b) / 2|</span>
<span class="line">+-----------------------------+-----------------------------+-----------------------------+</span>
<span class="line">|1970-01-01T08:00:00.010+08:00| 1.0| 1.0|</span>
<span class="line">|1970-01-01T08:00:00.020+08:00| 2.0| 2.0|</span>
<span class="line">|1970-01-01T08:00:00.030+08:00| 3.0| 3.0|</span>
<span class="line">|1970-01-01T08:00:00.040+08:00| 4.0| null|</span>
<span class="line">|1970-01-01T08:00:00.060+08:00| 6.0| 6.0|</span>
<span class="line">+-----------------------------+-----------------------------+-----------------------------+</span>
<span class="line">Total line number = 5</span>
<span class="line">It costs 0.011s</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="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>示例 4:</strong></p><div class="language-sql line-numbers-mode" data-highlighter="prismjs" data-ext="sql" data-title="sql"><pre><code><span class="line"><span class="token keyword">select</span> <span class="token punctuation">(</span>a <span class="token operator">+</span> b<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">3</span> <span class="token keyword">from</span> root<span class="token punctuation">.</span>sg<span class="token punctuation">,</span> root<span class="token punctuation">.</span>ln</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>运行结果:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">+-----------------------------+---------------------------+---------------------------+---------------------------+---------------------------+</span>
<span class="line">| Time|(root.sg.a + root.sg.b) * 3|(root.sg.a + root.ln.b) * 3|(root.ln.a + root.sg.b) * 3|(root.ln.a + root.ln.b) * 3|</span>
<span class="line">+-----------------------------+---------------------------+---------------------------+---------------------------+---------------------------+</span>
<span class="line">|1970-01-01T08:00:00.010+08:00| 90.0| 270.0| 360.0| 540.0|</span>
<span class="line">|1970-01-01T08:00:00.020+08:00| 150.0| 330.0| 690.0| 870.0|</span>
<span class="line">|1970-01-01T08:00:00.030+08:00| 210.0| 450.0| 570.0| 810.0|</span>
<span class="line">|1970-01-01T08:00:00.040+08:00| 270.0| 240.0| 690.0| 660.0|</span>
<span class="line">|1970-01-01T08:00:00.050+08:00| 330.0| null| null| null|</span>
<span class="line">|1970-01-01T08:00:00.060+08:00| 390.0| null| null| null|</span>
<span class="line">|1970-01-01T08:00:00.070+08:00| 450.0| null| null| null|</span>
<span class="line">|1970-01-01T08:00:00.090+08:00| 60.0| null| null| null|</span>
<span class="line">|1970-01-01T08:00:00.100+08:00| 60.0| null| null| null|</span>
<span class="line">+-----------------------------+---------------------------+---------------------------+---------------------------+---------------------------+</span>
<span class="line">Total line number = 9</span>
<span class="line">It costs 0.014s</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="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="#聚合查询嵌套表达式"><span>聚合查询嵌套表达式</span></a></h5><p>IoTDB 支持在 <code>SELECT</code> 子句中计算由<strong>聚合函数、常量、时间序列生成函数和表达式</strong>组成的任意嵌套表达式。</p><p><strong>说明:</strong></p><ul><li>当某个时间戳下左操作数和右操作数都不为空(<code>null</code>)时,表达式才会有结果,否则表达式值为<code>null</code>,且默认不出现在结果集中。但在使用<code>GROUP BY</code>子句的聚合查询嵌套表达式中,我们希望保留每个时间窗口的值,所以表达式值为<code>null</code>的窗口也包含在结果集中。</li><li>如果表达式中某个操作数对应多条时间序列(如通配符<code>*</code>),那么每条时间序列对应的结果都会出现在结果集中(按照笛卡尔积形式)。</li></ul><p><strong>示例 1:</strong></p><div class="language-sql line-numbers-mode" data-highlighter="prismjs" data-ext="sql" data-title="sql"><pre><code><span class="line"><span class="token keyword">select</span> <span class="token function">avg</span><span class="token punctuation">(</span>temperature<span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line"> sin<span class="token punctuation">(</span><span class="token function">avg</span><span class="token punctuation">(</span>temperature<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line"> <span class="token function">avg</span><span class="token punctuation">(</span>temperature<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span></span>
<span class="line"> <span class="token operator">-</span><span class="token function">sum</span><span class="token punctuation">(</span>hardware<span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line"> <span class="token function">avg</span><span class="token punctuation">(</span>temperature<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token function">sum</span><span class="token punctuation">(</span>hardware<span class="token punctuation">)</span></span>
<span class="line"><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></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="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><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">+----------------------------------+---------------------------------------+--------------------------------------+--------------------------------+--------------------------------------------------------------------+</span>
<span class="line">|avg(root.ln.wf01.wt01.temperature)|sin(avg(root.ln.wf01.wt01.temperature))|avg(root.ln.wf01.wt01.temperature) + 1|-sum(root.ln.wf01.wt01.hardware)|avg(root.ln.wf01.wt01.temperature) + sum(root.ln.wf01.wt01.hardware)|</span>
<span class="line">+----------------------------------+---------------------------------------+--------------------------------------+--------------------------------+--------------------------------------------------------------------+</span>
<span class="line">| 15.927999999999999| -0.21826546964855045| 16.927999999999997| -7426.0| 7441.928|</span>
<span class="line">+----------------------------------+---------------------------------------+--------------------------------------+--------------------------------+--------------------------------------------------------------------+</span>
<span class="line">Total line number = 1</span>
<span class="line">It costs 0.009s</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="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><div class="language-sql line-numbers-mode" data-highlighter="prismjs" data-ext="sql" data-title="sql"><pre><code><span class="line"><span class="token keyword">select</span> <span class="token function">avg</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">,</span> </span>
<span class="line"> <span class="token punctuation">(</span><span class="token function">avg</span><span class="token punctuation">(</span><span class="token operator">*</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">3</span> <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span><span class="token number">1</span> </span>
<span class="line"><span class="token keyword">from</span> root<span class="token punctuation">.</span>sg1</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>运行结果:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">+---------------+---------------+-------------------------------------+-------------------------------------+</span>
<span class="line">|avg(root.sg1.a)|avg(root.sg1.b)|(avg(root.sg1.a) + 1) * 3 / 2 - 1 |(avg(root.sg1.b) + 1) * 3 / 2 - 1 |</span>
<span class="line">+---------------+---------------+-------------------------------------+-------------------------------------+</span>
<span class="line">| 3.2| 3.4| 5.300000000000001| 5.6000000000000005|</span>
<span class="line">+---------------+---------------+-------------------------------------+-------------------------------------+</span>
<span class="line">Total line number = 1</span>
<span class="line">It costs 0.007s</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="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>示例 3:</strong></p><div class="language-sql line-numbers-mode" data-highlighter="prismjs" data-ext="sql" data-title="sql"><pre><code><span class="line"><span class="token keyword">select</span> <span class="token function">avg</span><span class="token punctuation">(</span>temperature<span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line"> sin<span class="token punctuation">(</span><span class="token function">avg</span><span class="token punctuation">(</span>temperature<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line"> <span class="token function">avg</span><span class="token punctuation">(</span>temperature<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span></span>
<span class="line"> <span class="token operator">-</span><span class="token function">sum</span><span class="token punctuation">(</span>hardware<span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line"> <span class="token function">avg</span><span class="token punctuation">(</span>temperature<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token function">sum</span><span class="token punctuation">(</span>hardware<span class="token punctuation">)</span> <span class="token keyword">as</span> custom_sum</span>
<span class="line"><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>
<span class="line"><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">10</span><span class="token punctuation">,</span> <span class="token number">90</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">10</span>ms<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="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><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">+-----------------------------+----------------------------------+---------------------------------------+--------------------------------------+--------------------------------+----------+</span>
<span class="line">| Time|avg(root.ln.wf01.wt01.temperature)|sin(avg(root.ln.wf01.wt01.temperature))|avg(root.ln.wf01.wt01.temperature) + 1|-sum(root.ln.wf01.wt01.hardware)|custom_sum|</span>
<span class="line">+-----------------------------+----------------------------------+---------------------------------------+--------------------------------------+--------------------------------+----------+</span>
<span class="line">|1970-01-01T08:00:00.010+08:00| 13.987499999999999| 0.9888207947857667| 14.987499999999999| -3211.0| 3224.9875|</span>
<span class="line">|1970-01-01T08:00:00.020+08:00| 29.6| -0.9701057337071853| 30.6| -3720.0| 3749.6|</span>
<span class="line">|1970-01-01T08:00:00.030+08:00| null| null| null| null| null|</span>
<span class="line">|1970-01-01T08:00:00.040+08:00| null| null| null| null| null|</span>
<span class="line">|1970-01-01T08:00:00.050+08:00| null| null| null| null| null|</span>
<span class="line">|1970-01-01T08:00:00.060+08:00| null| null| null| null| null|</span>
<span class="line">|1970-01-01T08:00:00.070+08:00| null| null| null| null| null|</span>
<span class="line">|1970-01-01T08:00:00.080+08:00| null| null| null| null| null|</span>
<span class="line">+-----------------------------+----------------------------------+---------------------------------------+--------------------------------------+--------------------------------+----------+</span>
<span class="line">Total line number = 8</span>
<span class="line">It costs 0.012s</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="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>`,38))])}const m=o(c,[["render",u],["__file","Operator-and-Expression.html.vue"]]),k=JSON.parse('{"path":"/zh/UserGuide/V1.2.x/User-Manual/Operator-and-Expression.html","title":"运算符、函数和表达式","lang":"zh-CN","frontmatter":{"description":"运算符、函数和表达式 运算符 算数运算符 比较运算符 逻辑运算符 运算符优先级 运算符的优先级从高到低排列如下,同一行的运算符优先级相同。 内置函数 列表中的函数无须注册即可在 IoTDB 中使用,数据函数质量库中的函数需要参考注册步骤进行注册后才能使用。 聚合函数 数学函数 比较函数 字符串函数 数据类型转换函数 常序列生成函数 选择函数 区间查询函...","head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://iotdb.apache.org/UserGuide/V1.2.x/User-Manual/Operator-and-Expression.html"}],["meta",{"property":"og:url","content":"https://iotdb.apache.org/zh/UserGuide/V1.2.x/User-Manual/Operator-and-Expression.html"}],["meta",{"property":"og:site_name","content":"IoTDB Website"}],["meta",{"property":"og:title","content":"运算符、函数和表达式"}],["meta",{"property":"og:description","content":"运算符、函数和表达式 运算符 算数运算符 比较运算符 逻辑运算符 运算符优先级 运算符的优先级从高到低排列如下,同一行的运算符优先级相同。 内置函数 列表中的函数无须注册即可在 IoTDB 中使用,数据函数质量库中的函数需要参考注册步骤进行注册后才能使用。 聚合函数 数学函数 比较函数 字符串函数 数据类型转换函数 常序列生成函数 选择函数 区间查询函..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2023-09-18T10:38:12.000Z"}],["meta",{"property":"article:modified_time","content":"2023-09-18T10:38:12.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"运算符、函数和表达式\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2023-09-18T10:38:12.000Z\\",\\"author\\":[]}"]]},"headers":[{"level":2,"title":"运算符","slug":"运算符","link":"#运算符","children":[{"level":3,"title":"算数运算符","slug":"算数运算符","link":"#算数运算符","children":[]},{"level":3,"title":"比较运算符","slug":"比较运算符","link":"#比较运算符","children":[]},{"level":3,"title":"逻辑运算符","slug":"逻辑运算符","link":"#逻辑运算符","children":[]},{"level":3,"title":"运算符优先级","slug":"运算符优先级","link":"#运算符优先级","children":[]}]},{"level":2,"title":"内置函数","slug":"内置函数","link":"#内置函数","children":[{"level":3,"title":"聚合函数","slug":"聚合函数","link":"#聚合函数","children":[]},{"level":3,"title":"数学函数","slug":"数学函数","link":"#数学函数","children":[]},{"level":3,"title":"比较函数","slug":"比较函数","link":"#比较函数","children":[]},{"level":3,"title":"字符串函数","slug":"字符串函数","link":"#字符串函数","children":[]},{"level":3,"title":"数据类型转换函数","slug":"数据类型转换函数","link":"#数据类型转换函数","children":[]},{"level":3,"title":"常序列生成函数","slug":"常序列生成函数","link":"#常序列生成函数","children":[]},{"level":3,"title":"选择函数","slug":"选择函数","link":"#选择函数","children":[]},{"level":3,"title":"区间查询函数","slug":"区间查询函数","link":"#区间查询函数","children":[]},{"level":3,"title":"趋势计算函数","slug":"趋势计算函数","link":"#趋势计算函数","children":[]},{"level":3,"title":"采样函数","slug":"采样函数","link":"#采样函数","children":[]},{"level":3,"title":"时间序列处理函数","slug":"时间序列处理函数","link":"#时间序列处理函数","children":[]}]},{"level":2,"title":"数据质量函数库","slug":"数据质量函数库","link":"#数据质量函数库","children":[{"level":3,"title":"关于","slug":"关于","link":"#关于","children":[]},{"level":3,"title":"快速上手","slug":"快速上手","link":"#快速上手","children":[]},{"level":3,"title":"已经实现的函数","slug":"已经实现的函数","link":"#已经实现的函数","children":[]}]},{"level":2,"title":"Lambda 表达式","slug":"lambda-表达式","link":"#lambda-表达式","children":[]},{"level":2,"title":"条件表达式","slug":"条件表达式","link":"#条件表达式","children":[]},{"level":2,"title":"SELECT 表达式","slug":"select-表达式","link":"#select-表达式","children":[]}],"git":{"createdTime":1688958677000,"updatedTime":1695033492000,"contributors":[{"name":"Lei","email":"33376433+LeiRui@users.noreply.github.com","commits":1},{"name":"wanghui42","email":"105700158+wanghui42@users.noreply.github.com","commits":1}]},"readingTime":{"minutes":18.67,"words":5600},"filePathRelative":"zh/UserGuide/V1.2.x/User-Manual/Operator-and-Expression.md","localizedDate":"2023年7月10日","autoDesc":true}');export{m as comp,k as data};