homework-jianmu/2.0/documentation/tdenginedocs-cn/taos-sql/index.html

388 lines
27 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang='cn'><head><title>文档 | 涛思数据</title><meta name='description' content='TDengine是一个开源的专为物联网、车联网、工业互联网、IT运维等设计和优化的大数据平台。除核心的快10倍以上的时序数据库功能外还提供缓存、数据订阅、流式计算等功能最大程度减少研发和运维的工作量。'><meta name='keywords' content='大数据Big Data开源物联网车联网工业互联网IT运维, 时序数据库缓存数据订阅消息队列流式计算开源涛思数据TAOS Data, TDengine'><meta name='title' content='文档 | 涛思数据'><meta property='og:site_name' content='涛思数据'/><meta property='og:title' content='文档 | 涛思数据'/><meta property='og:type' content='article'/><meta property='og:url' content='https://www.taosdata.com/cn/documentation/taos-sql-ch/index.php'/><meta property='og:description' content='TDengine是一个开源的专为物联网、车联网、工业互联网、IT运维等设计和优化的大数据平台。除核心的快10倍以上的时序数据库功能外还提供缓存、数据订阅、流式计算等功能最大程度减少研发和运维的工作量。' /><link rel='canonical' href='https://www.taosdata.com/cn/documentation/taos-sql-ch/index.php'/><script src='../lib/jquery-3.4.1.min.js' type='application/javascript'></script><link href='../lib/bootstrap.min.css' rel='stylesheet'><link href='../styles/base.min.css' rel='stylesheet'><link rel='stylesheet' href='../lib/docs/taosdataprettify.css'><link rel='stylesheet' href='../lib/docs/docs.css'><script src='../lib/docs/prettify.js'></script><script src='../lib/docs/prettyprint-sql.js'></script></head><body><script>$('#documentation-href').addClass('active')</script><div class='container-fluid'><main class='content-wrapper'><section class='documentation'><a href='../index.html'>回去</a><h1>TAOS SQL</h1>
<p>TDengine提供类似SQL语法用户可以在TDengine Shell中使用SQL语句操纵数据库也可以通过C/C++, Java(JDBC), Python, Go等各种程序来执行SQL语句。 </p>
<p>本章节SQL语法遵循如下约定</p>
<ul>
<li>< > 里的内容是用户需要输入的,但不要输入&lt;&gt;本身</li>
<li>[ ]表示内容为可选项,但不能输入[]本身</li>
<li>| 表示多选一,选择其中一个即可,但不能输入|本身</li>
<li>… 表示前面的项可重复多个</li>
</ul>
<a class='anchor' id='支持的数据类型'></a><h2>支持的数据类型</h2>
<p>使用TDengine最重要的是时间戳。创建并插入记录、查询历史记录的时候均需要指定时间戳。时间戳有如下规则</p>
<ul>
<li>时间格式为YYYY-MM-DD HH:mm:ss.MS, 默认时间分辨率为毫秒。比如2017-08-12 18:25:58.128</li>
<li>内部函数now是服务器的当前时间</li>
<li>插入记录时如果时间戳为0插入数据时使用服务器当前时间</li>
<li>Epoch Time: 时间戳也可以是一个长整数表示从1970-01-01 08:00:00.000开始的毫秒数</li>
<li>时间可以加减,比如 now-2h表明查询时刻向前推2个小时(最近2小时)。数字后面的时间单位a(毫秒), s(秒), m(分), h(小时), d(天)w(周), n(月), y(年)。比如select * from t1 where ts &gt; now-2w and ts &lt;= now-1w, 表示查询两周前整整一周的数据</li>
</ul>
<p>TDengine缺省的时间戳是毫秒精度但通过修改配置参数enableMicrosecond就可支持微秒。</p>
<p>在TDengine中普通表的数据模型中可使用以下10种数据类型。 </p>
<figure><table>
<thead>
<tr>
<th></th>
<th style="text-align:center;">类型</th>
<th>Bytes</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td style="text-align:center;">TIMESTAMP</td>
<td>8</td>
<td>时间戳。最小精度毫秒。从格林威治时间1970-01-01 08:00:00.000开始,计时不能早于该时间。</td>
</tr>
<tr>
<td>2</td>
<td style="text-align:center;">INT</td>
<td>4</td>
<td>整型,范围 [-2^31+1, 2^31-1], -2^31被用作Null值</td>
</tr>
<tr>
<td>3</td>
<td style="text-align:center;">BIGINT</td>
<td>8</td>
<td>长整型,范围 [-2^59, 2^59]</td>
</tr>
<tr>
<td>4</td>
<td style="text-align:center;">FLOAT</td>
<td>4</td>
<td>浮点型有效位数6-7范围 [-3.4E38, 3.4E38]</td>
</tr>
<tr>
<td>5</td>
<td style="text-align:center;">DOUBLE</td>
<td>8</td>
<td>双精度浮点型有效位数15-16范围 [-1.7E308, 1.7E308]</td>
</tr>
<tr>
<td>6</td>
<td style="text-align:center;">BINARY</td>
<td>自定义</td>
<td>用于记录字符串最长不能超过504 bytes。binary仅支持字符串输入字符串两端使用单引号引用否则英文全部自动转化为小写。使用时须指定大小如binary(20)定义了最长为20个字符的字符串每个字符占1byte的存储空间。如果用户字符串超出20字节将被自动截断。对于字符串内的单引号可以用转义字符反斜线加单引号来表示<strong>\</strong></td>
</tr>
<tr>
<td>7</td>
<td style="text-align:center;">SMALLINT</td>
<td>2</td>
<td>短整型, 范围 [-32767, 32767]</td>
</tr>
<tr>
<td>8</td>
<td style="text-align:center;">TINYINT</td>
<td>1</td>
<td>单字节整型,范围 [-127, 127]</td>
</tr>
<tr>
<td>9</td>
<td style="text-align:center;">BOOL</td>
<td>1</td>
<td>布尔型,{true, false}</td>
</tr>
<tr>
<td>10</td>
<td style="text-align:center;">NCHAR</td>
<td>自定义</td>
<td>用于记录非ASCII字符串如中文字符。每个nchar字符占用4bytes的存储空间。字符串两端使用单引号引用字符串内的单引号需用转义字符 <strong>\</strong>。nchar使用时须指定字符串大小类型为nchar(10)的列表示此列的字符串最多存储10个nchar字符会固定占用40bytes的空间。如用户字符串长度超出声明长度则将被自动截断。</td>
</tr>
</tbody>
</table></figure>
<p><strong>Tips</strong>: TDengine对SQL语句中的英文字符不区分大小写自动转化为小写执行。因此用户大小写敏感的字符串及密码需要使用单引号将字符串引起来。</p>
<a class='anchor' id='数据库管理'></a><h2>数据库管理</h2>
<ul>
<li><p><strong>创建数据库</strong> </p>
<pre><code class="mysql language-mysql">CREATE DATABASE [IF NOT EXISTS] db_name [KEEP keep]</code></pre>
<p>创建数据库。<code>KEEP</code>是该数据库的数据保留多长天数缺省是3650天(10年),数据库会自动删除超过时限的数据。数据库还有更多与存储相关的配置参数,请参见<a href="../administrator/#服务端配置">系统管理</a></p></li>
<li><p><strong>使用数据库</strong></p>
<pre><code class="mysql language-mysql">USE db_name</code></pre>
<p>使用/切换数据库</p></li>
<li><p><strong>删除数据库</strong></p>
<pre><code class="mysql language-mysql">DROP DATABASE [IF EXISTS] db_name</code></pre>
<p>删除数据库。所包含的全部数据表将被删除,谨慎使用</p></li>
<li><p><strong>显示系统所有数据库</strong></p>
<pre><code class="mysql language-mysql">SHOW DATABASES</code></pre></li>
</ul>
<a class='anchor' id='表管理'></a><h2>表管理</h2>
<ul>
<li><p><strong>创建数据表</strong></p>
<pre><code class="mysql language-mysql">CREATE TABLE [IF NOT EXISTS] tb_name (timestamp_field_name TIMESTAMP, field1_name data_type1 [, field2_name data_type2 ...])</code></pre>
<p>说明1表的第一个字段必须是TIMESTAMP并且系统自动将其设为主键2表的每行长度不能超过4096字节3使用数据类型binary或nchar需指定其最长的字节数如binary(20)表示20字节。</p></li>
<li><p><strong>删除数据表</strong></p>
<pre><code class="mysql language-mysql">DROP TABLE [IF EXISTS] tb_name</code></pre></li>
<li><p><strong>显示当前数据库下的所有数据表信息</strong></p>
<pre><code class="mysql language-mysql">SHOW TABLES [LIKE tb_name_wildcar]</code></pre>
<p>显示当前数据库下的所有数据表信息。说明可在like中使用通配符进行名称的匹配。 通配符匹配1% (百分号)匹配0到任意个字符2_下划线匹配一个字符。</p></li>
<li><p><strong>获取表的结构信息</strong></p>
<pre><code class="mysql language-mysql">DESCRIBE tb_name</code></pre></li>
<li><p><strong>表增加列</strong></p>
<pre><code class="mysql language-mysql">ALTER TABLE tb_name ADD COLUMN field_name data_type</code></pre></li>
<li><p><strong>表删除列</strong></p>
<pre><code class="mysql language-mysql">ALTER TABLE tb_name DROP COLUMN field_name </code></pre>
<p>如果表是通过<a href="../super-table/">超级表</a>创建,更改表结构的操作只能对超级表进行。同时针对超级表的结构更改对所有通过该结构创建的表生效。对于不是通过超级表创建的表,可以直接修改表结构</p>
<p><strong>Tips</strong>SQL语句中操作的当前数据库通过use db_name的方式指定中的表不需要指定表所属数据库。如果要操作非当前数据库中的表需要采用“库名”.“表名”的方式。例如demo.tb1是指数据库demo中的表tb1。</p></li>
</ul>
<a class='anchor' id='数据写入'></a><h2>数据写入</h2>
<ul>
<li><p><strong>插入一条记录</strong></p>
<pre><code class="mysql language-mysql">INSERT INTO tb_name VALUES (field_value, ...);</code></pre>
<p>向表tb_name中插入一条记录</p></li>
<li><p><strong>插入一条记录,数据对应到指定的列</strong></p>
<pre><code class="mysql language-mysql">INSERT INTO tb_name (field1_name, ...) VALUES(field1_value, ...)</code></pre>
<p>向表tb_name中插入一条记录数据对应到指定的列。SQL语句中没有出现的列数据库将自动填充为NULL。主键时间戳不能为NULL。</p></li>
<li><p><strong>插入多条记录</strong></p>
<pre><code class="mysql language-mysql">INSERT INTO tb_name VALUES (field1_value1, ...) (field1_value2, ...)...;</code></pre>
<p>向表tb_name中插入多条记录</p></li>
<li><p><strong>按指定的列插入多条记录</strong></p>
<pre><code class="mysql language-mysql">INSERT INTO tb_name (field1_name, ...) VALUES(field1_value1, ...) (field1_value2, ...)</code></pre>
<p>向表tb_name中按指定的列插入多条记录</p></li>
<li><p><strong>向多个表插入多条记录</strong></p>
<pre><code class="mysql language-mysql">INSERT INTO tb1_name VALUES (field1_value1, ...)(field1_value2, ...)...
tb2_name VALUES (field1_value1, ...)(field1_value2, ...)...;</code></pre>
<p>同时向表tb1_name和tb2_name中分别插入多条记录</p></li>
<li><p><strong>同时向多个表按列插入多条记录</strong></p>
<pre><code class="mysql language-mysql">INSERT INTO tb1_name (tb1_field1_name, ...) VALUES (field1_value1, ...) (field1_value1, ...)
tb2_name (tb2_field1_name, ...) VALUES(field1_value1, ...) (field1_value2, ...)</code></pre>
<p>同时向表tb1_name和tb2_name中按列分别插入多条记录 </p></li>
</ul>
<p>注意对同一张表插入的新记录的时间戳必须递增否则会跳过插入该条记录。如果时间戳为0系统将自动使用服务器当前时间作为该记录的时间戳。</p>
<p><strong>IMPORT</strong>如果需要将时间戳小于最后一条记录时间的记录写入到数据库中可使用IMPORT替代INSERT命令IMPORT的语法与INSERT完全一样。如果同时IMPORT多条记录需要保证一批记录是按时间戳排序好的。</p>
<a class='anchor' id='数据查询'></a><h2>数据查询</h2>
<a class='anchor' id='查询语法是:'></a><h3>查询语法是:</h3>
<pre><code class="mysql language-mysql">SELECT {* | expr_list} FROM tb_name
[WHERE where_condition]
[ORDER BY _c0 { DESC | ASC }]
[LIMIT limit [, OFFSET offset]]
[&gt;&gt; export_file]
SELECT function_list FROM tb_name
[WHERE where_condition]
[LIMIT limit [, OFFSET offset]]
[&gt;&gt; export_file]</code></pre>
<ul>
<li>可以使用* 返回所有列,或指定列名。可以对数字列进行四则运算,可以给输出的列取列名</li>
<li>where语句可以使用各种逻辑判断来过滤数字值或使用通配符来过滤字符串</li>
<li>输出结果缺省按首列时间戳升序排序,但可以指定按降序排序(_c0指首列时间戳)。使用ORDER BY对其他字段进行排序为非法操作。</li>
<li>参数LIMIT控制输出条数OFFSET指定从第几条开始输出。LIMIT/OFFSET对结果集的执行顺序在ORDER BY之后。</li>
<li>通过”&gt;&gt;"输出结果可以导出到指定文件</li>
</ul>
<a class='anchor' id='支持的条件过滤操作'></a><h3>支持的条件过滤操作</h3>
<figure><table>
<thead>
<tr>
<th>Operation</th>
<th>Note</th>
<th>Applicable Data Types</th>
</tr>
</thead>
<tbody>
<tr>
<td>&gt;</td>
<td>larger than</td>
<td><strong><code>timestamp</code></strong> and all numeric types</td>
</tr>
<tr>
<td>&lt;</td>
<td>smaller than</td>
<td><strong><code>timestamp</code></strong> and all numeric types</td>
</tr>
<tr>
<td>&gt;=</td>
<td>larger than or equal to</td>
<td><strong><code>timestamp</code></strong> and all numeric types</td>
</tr>
<tr>
<td>&lt;=</td>
<td>smaller than or equal to</td>
<td><strong><code>timestamp</code></strong> and all numeric types</td>
</tr>
<tr>
<td>=</td>
<td>equal to</td>
<td>all types</td>
</tr>
<tr>
<td>&lt;&gt;</td>
<td>not equal to</td>
<td>all types</td>
</tr>
<tr>
<td>%</td>
<td>match with any char sequences</td>
<td><strong><code>binary</code></strong> <strong><code>nchar</code></strong></td>
</tr>
<tr>
<td>_</td>
<td>match with a single char</td>
<td><strong><code>binary</code></strong> <strong><code>nchar</code></strong></td>
</tr>
</tbody>
</table></figure>
<ol>
<li>同时进行多个字段的范围过滤需要使用关键词AND进行连接不同的查询条件暂不支持OR连接的查询条件。</li>
<li>针对某一字段的过滤只支持单一区间的过滤条件。例如value&gt;20 and value<30是合法的过滤条件, 而Value<20 AND value<>5是非法的过滤条件。</li>
</ol>
<a class='anchor' id='Some-Examples'></a><h3>Some Examples</h3>
<ul>
<li><p>对于下面的例子表tb1用以下语句创建</p>
<pre><code class="mysql language-mysql">CREATE TABLE tb1 (ts timestamp, col1 int, col2 float, col3 binary(50))</code></pre></li>
<li><p>查询tb1刚过去的一个小时的所有记录</p>
<pre><code class="mysql language-mysql">SELECT * FROM tb1 WHERE ts &gt;= NOW - 1h</code></pre></li>
<li><p>查询表tb1从2018-06-01 08:00:00.000 到2018-06-02 08:00:00.000时间范围并且clo3的字符串是'nny'结尾的记录,结果按照时间戳降序</p>
<pre><code class="mysql language-mysql">SELECT * FROM tb1 WHERE ts &gt; '2018-06-01 08:00:00.000' AND ts &lt;= '2018-06-02 08:00:00.000' AND col3 LIKE '%nny' ORDER BY ts DESC</code></pre></li>
<li><p>查询col1与col2的和并取名complex, 时间大于2018-06-01 08:00:00.000, col2大于1.2结果输出仅仅10条记录从第5条开始</p>
<pre><code class="mysql language-mysql">SELECT (col1 + col2) AS 'complex' FROM tb1 WHERE ts &gt; '2018-06-01 08:00:00.000' and col2 &gt; 1.2 LIMIT 10 OFFSET 5</code></pre></li>
<li><p>查询过去10分钟的记录col2的值大于3.14,并且将结果输出到文件 <code>/home/testoutpu.csv</code>.</p>
<pre><code class="mysql language-mysql">SELECT COUNT(*) FROM tb1 WHERE ts &gt;= NOW - 10m AND col2 &gt; 3.14 &gt;&gt; /home/testoutpu.csv</code></pre></li>
</ul>
<a class='anchor' id='SQL函数'></a><h2>SQL函数</h2>
<a class='anchor' id='聚合函数'></a><h3>聚合函数</h3>
<p>TDengine支持针对数据的聚合查询。提供支持的聚合和提取函数如下表</p>
<ul>
<li><p><strong>COUNT</strong></p>
<pre><code class="mysql language-mysql">SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause]</code></pre>
<p>功能说明:统计表/超级表中记录行数或某列的非空值个数。<br />
返回结果数据类型长整型INT64。<br />
应用字段:应用全部字段。<br />
适用于:表、超级表。<br />
说明1可以使用星号<em>来替代具体的字段,使用星号(</em>)返回全部记录数量。2针对同一表的不包含NULL值字段查询结果均相同。3如果统计对象是具体的列则返回该列中非NULL值的记录数量。 </p></li>
<li><p><strong>AVG</strong></p>
<pre><code class="mysql language-mysql">SELECT AVG(field_name) FROM tb_name [WHERE clause]</code></pre>
<p>功能说明:统计表/超级表中某列的平均值。<br />
返回结果数据类型双精度浮点数Double。<br />
应用字段不能应用在timestamp、binary、nchar、bool字段。<br />
适用于:表、超级表。 </p></li>
<li><p><strong>WAVG</strong></p>
<pre><code class="mysql language-mysql">SELECT WAVG(field_name) FROM tb_name WHERE clause</code></pre>
<p>功能说明:统计表/超级表中某列在一段时间内的时间加权平均。<br />
返回结果数据类型双精度浮点数Double。<br />
应用字段不能应用在timestamp、binary、nchar、bool类型字段。<br />
适用于:表、超级表。</p></li>
<li><p><strong>SUM</strong></p>
<pre><code class="mysql language-mysql">SELECT SUM(field_name) FROM tb_name [WHERE clause]</code></pre>
<p>功能说明:统计表/超级表中某列的和。<br />
返回结果数据类型双精度浮点数Double和长整型INT64。<br />
应用字段不能应用在timestamp、binary、nchar、bool类型字段。<br />
适用于:表、超级表。</p></li>
<li><p><strong>STDDEV</strong></p>
<pre><code class="mysql language-mysql">SELECT STDDEV(field_name) FROM tb_name [WHERE clause]</code></pre>
<p>功能说明:统计表中某列的均方差。<br />
返回结果数据类型双精度浮点数Double。<br />
应用字段不能应用在timestamp、binary、nchar、bool类型字段。<br />
适用于:表。</p></li>
<li><p><strong>LEASTSQUARES</strong></p>
<pre><code class="mysql language-mysql">SELECT LEASTSQUARES(field_name) FROM tb_name [WHERE clause]</code></pre>
<p>功能说明:统计表中某列的值是主键(时间戳)的拟合直线方程。<br />
返回结果数据类型:字符串表达式(斜率, 截距)。<br />
应用字段不能应用在timestamp、binary、nchar、bool类型字段。<br />
说明:自变量是时间戳,因变量是该列的值。<br />
适用于:表。</p></li>
</ul>
<a class='anchor' id='选择函数'></a><h3>选择函数</h3>
<ul>
<li><p><strong>MIN</strong></p>
<pre><code class="mysql language-mysql">SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause]</code></pre>
<p>功能说明:统计表/超级表中某列的值最小值。<br />
返回结果数据类型:同应用的字段。<br />
应用字段不能应用在timestamp、binary、nchar、bool类型字段。</p></li>
<li><p><strong>MAX</strong></p>
<pre><code class="mysql language-mysql">SELECT MAX(field_name) FROM { tb_name | stb_name } [WHERE clause]</code></pre>
<p>功能说明:统计表/超级表中某列的值最大值。<br />
返回结果数据类型:同应用的字段。<br />
应用字段不能应用在timestamp、binary、nchar、bool类型字段。</p></li>
<li><p><strong>FIRST</strong></p>
<pre><code class="mysql language-mysql">SELECT FIRST(field_name) FROM { tb_name | stb_name } [WHERE clause]</code></pre>
<p>功能说明:统计表/超级表中某列的值最先写入的非NULL值。<br />
返回结果数据类型:同应用的字段。<br />
应用字段:所有字段。<br />
说明1如果要返回各个列的首个时间戳最小非NULL值可以使用FIRST(*)2) 如果结果集中的某列全部为NULL值则该列的返回结果也是NULL3) 如果结果集中所有列全部为NULL值则不返回结果。</p></li>
<li><p><strong>LAST</strong></p>
<pre><code class="mysql language-mysql">SELECT LAST(field_name) FROM { tb_name | stb_name } [WHERE clause]</code></pre>
<p>功能说明:统计表/超级表中某列的值最后写入的非NULL值。<br />
返回结果数据类型:同应用的字段。<br />
应用字段:所有字段。<br />
说明1如果要返回各个列的最后时间戳最大一个非NULL值可以使用LAST(*)2如果结果集中的某列全部为NULL值则该列的返回结果也是NULL如果结果集中所有列全部为NULL值则不返回结果。</p></li>
<li><p><strong>TOP</strong></p>
<pre><code class="mysql language-mysql">SELECT TOP(field_name, K) FROM { tb_name | stb_name } [WHERE clause]</code></pre>
<p>功能说明: 统计表/超级表中某列的值最大<em>k</em>个非NULL值。若多于k个列值并列最大则返回时间戳小的。<br />
返回结果数据类型:同应用的字段。<br />
应用字段不能应用在timestamp、binary、nchar、bool类型字段。<br />
说明1<em>k</em>值取值范围1≤<em>k</em>≤1002系统同时返回该记录关联的时间戳列。 </p></li>
<li><p><strong>BOTTOM</strong></p>
<pre><code class="mysql language-mysql">SELECT BOTTOM(field_name, K) FROM { tb_name | stb_name } [WHERE clause]</code></pre>
<p>功能说明:统计表/超级表中某列的值最小<em>k</em>个非NULL值。若多于k个列值并列最小则返回时间戳小的。<br />
返回结果数据类型:同应用的字段。<br />
应用字段不能应用在timestamp、binary、nchar、bool类型字段。<br />
说明1<em>k</em>值取值范围1≤<em>k</em>≤1002系统同时返回该记录关联的时间戳列。</p></li>
<li><p><strong>PERCENTILE</strong></p>
<pre><code class="mysql language-mysql">SELECT PERCENTILE(field_name, P) FROM { tb_name | stb_name } [WHERE clause]</code></pre>
<p>功能说明:统计表中某列的值百分比分位数。<br />
返回结果数据类型: 双精度浮点数Double。<br />
应用字段不能应用在timestamp、binary、nchar、bool类型字段。<br />
说明:<em>k</em>值取值范围0≤<em>k</em>≤100为0的时候等同于MIN为100的时候等同于MAX。</p></li>
<li><p><strong>LAST_ROW</strong></p>
<pre><code class="mysql language-mysql">SELECT LAST_ROW(field_name) FROM { tb_name | stb_name }</code></pre>
<p>功能说明:返回表(超级表)的最后一条记录。<br />
返回结果数据类型:同应用的字段。<br />
应用字段:所有字段。<br />
说明与last函数不同last_row不支持时间范围限制强制返回最后一条记录。</p></li>
</ul>
<a class='anchor' id='计算函数'></a><h3>计算函数</h3>
<ul>
<li><p><strong>DIFF</strong></p>
<pre><code class="mysql language-mysql">SELECT DIFF(field_name) FROM tb_name [WHERE clause]</code></pre>
<p>功能说明:统计表中某列的值与前一行对应值的差。<br />
返回结果数据类型: 同应用字段。<br />
应用字段不能应用在timestamp、binary、nchar、bool类型字段。<br />
说明:输出结果行数是范围内总行数减一,第一行没有结果输出。</p></li>
<li><p><strong>SPREAD</strong></p>
<pre><code class="mysql language-mysql">SELECT SPREAD(field_name) FROM { tb_name | stb_name } [WHERE clause]</code></pre>
<p>功能说明:统计表/超级表中某列的最大值和最小值之差。<br />
返回结果数据类型: 双精度浮点数。<br />
应用字段不能应用在binary、nchar、bool类型字段。<br />
说明可用于TIMESTAMP字段此时表示记录的时间覆盖范围。</p></li>
<li><p><strong>四则运算</strong></p>
<pre><code class="mysql language-mysql">SELECT field_name [+|-|*|/|%][Value|field_name] FROM { tb_name | stb_name } [WHERE clause]</code></pre>
<p>功能说明:统计表/超级表中某列或多列间的值加、减、乘、除、取余计算结果。<br />
返回结果数据类型:双精度浮点数。<br />
应用字段不能应用在timestamp、binary、nchar、bool类型字段。<br />
说明1支持两列或多列之间进行计算可使用括号控制计算优先级;2NULL字段不参与计算如果参与计算的某行中包含NULL该行的计算结果为NULL。</p></li>
</ul>
<a class='anchor' id='时间维度聚合'></a><h2>时间维度聚合</h2>
<p>TDengine支持按时间段进行聚合可以将表中数据按照时间段进行切割后聚合生成结果比如温度传感器每秒采集一次数据但需查询每隔10分钟的温度平均值。这个聚合适合于降维(down sample)操作, 语法如下:</p>
<pre><code class="mysql language-mysql">SELECT function_list FROM tb_name
[WHERE where_condition]
INTERVAL (interval)
[FILL ({NONE | VALUE | PREV | NULL | LINEAR})]
SELECT function_list FROM stb_name
[WHERE where_condition]
[FILL ({ VALUE | PREV | NULL | LINEAR})]
INTERVAL (interval)
[GROUP BY tags]</code></pre>
<ul>
<li>聚合时间段的长度由关键词INTERVAL指定最短时间间隔10毫秒10a。聚合查询中能够同时执行的聚合和选择函数仅限于单个输出的函数count、avg、sum 、stddev、leastsquares、percentile、min、max、first、last不能使用具有多行输出结果的函数例如top、bottom、diff以及四则运算</li>
<li>WHERE语句可以指定查询的起止时间和其他过滤条件 </li>
<li>FILL语句指定某一时间区间数据缺失的情况下的填充模式。填充模式包括以下几种</li>
</ul>
<ol>
<li><p>不进行填充NONE(默认填充模式)。</p></li>
<li><p>VALUE填充固定值填充此时需要指定填充的数值。例如fill(value, 1.23)。</p></li>
<li><p>NULL填充使用NULL填充数据。例如fill(null)。</p></li>
<li><p>PREV填充使用前一个非NULL值填充数据。例如fill(prev)。 </p></li>
</ol>
<p>说明: </p>
<ol>
<li>使用FILL语句的时候可能生成大量的填充输出务必指定查询的时间区间。针对每次查询系统可返回不超过1千万条具有插值的结果。</li>
<li>在时间维度聚合中,返回的结果中时间序列严格单调递增。</li>
<li>如果查询对象是超级表则聚合函数会作用于该超级表下满足值过滤条件的所有表的数据。如果查询中没有使用group by语句则返回的结果按照时间序列严格单调递增如果查询中使用了group by语句分组则返回结果中每个group内不按照时间序列严格单调递增。</li>
</ol>
<p><strong>示例:</strong>温度数据表的建表语句如下:</p>
<pre><code class="mysql language-mysql">create table sensor(ts timestamp, degree double, pm25 smallint) </code></pre>
<p>针对传感器采集的数据以10分钟为一个阶段计算过去24小时的温度数据的平均值、最大值、温度的中位数、以及随着时间变化的温度走势拟合直线。如果没有计算值用前一个非NULL值填充。</p>
<pre><code class="mysql language-mysql">SELECT AVG(degree),MAX(degree),LEASTSQUARES(degree), PERCENTILE(degree, 50) FROM sensor
WHERE TS&gt;=NOW-1d
INTERVAL(10m)
FILL(PREV);</code></pre><a href='../index.html'>回去</a></section></main></div><?php include($s.'/footer.php'); ?><script>$('pre').addClass('prettyprint linenums');PR.prettyPrint()</script><script src='lib/docs/liner.js'></script></body></html>