六月婷婷AV,国产偷窥猎奇福利二区,日韩三级片。,好吊色网站,日韩成人中文在线视频,国产亚洲午夜啪啪,亚洲欧美另类国产精品,国产成人av1,任你艹在线观看

TAOS SQL

本文檔說明 TAOS SQL 支持的語法規(guī)則、主要查詢功能、支持的 SQL 查詢函數(shù),以及常用技巧等內(nèi)容。閱讀本文檔需要讀者具有基本的 SQL 語言的基礎(chǔ)。

TAOS SQL 是用戶對(duì) TDengine 進(jìn)行數(shù)據(jù)寫入和查詢的主要工具。TAOS SQL 為了便于用戶快速上手,在一定程度上提供類似于標(biāo)準(zhǔn) SQL 類似的風(fēng)格和模式。嚴(yán)格意義上,TAOS SQL 并不是也不試圖提供 SQL 標(biāo)準(zhǔn)的語法。此外,由于 TDengine 針對(duì)的時(shí)序性結(jié)構(gòu)化數(shù)據(jù)不提供刪除功能,因此在 TAO SQL 中不提供數(shù)據(jù)刪除的相關(guān)功能。

TAOS SQL 目前僅支持 DESCRIBE 關(guān)鍵字的縮寫,DESCRIBE 可以縮寫為 DESC。

本章節(jié) SQL 語法遵循如下約定:

  • < > 里的內(nèi)容是用戶需要輸入的,但不要輸入 <> 本身
  • [ ] 表示內(nèi)容為可選項(xiàng),但不能輸入 [] 本身
  • | 表示多選一,選擇其中一個(gè)即可,但不能輸入 | 本身
  • … 表示前面的項(xiàng)可重復(fù)多個(gè)

為更好地說明 SQL 語法的規(guī)則及其特點(diǎn),本文假設(shè)存在一個(gè)數(shù)據(jù)集。以智能電表(meters)為例,假設(shè)每個(gè)智能電表采集電流、電壓、相位三個(gè)量。其建模如下:

taos> DESCRIBE meters;
             Field              |        Type        |   Length    |    Note    |
=================================================================================
 ts                             | TIMESTAMP          |           8 |            |
 current                        | FLOAT              |           4 |            |
 voltage                        | INT                |           4 |            |
 phase                          | FLOAT              |           4 |            |
 location                       | BINARY             |          64 | TAG        |
 groupid                        | INT                |           4 | TAG        |

數(shù)據(jù)集包含 4 個(gè)智能電表的數(shù)據(jù),按照 TDengine 的建模規(guī)則,對(duì)應(yīng) 4 個(gè)子表,其名稱分別是 d1001, d1002, d1003, d1004。

支持的數(shù)據(jù)類型

使用 TDengine,最重要的是時(shí)間戳。創(chuàng)建并插入記錄、查詢歷史記錄的時(shí)候,均需要指定時(shí)間戳。時(shí)間戳有如下規(guī)則:

  • 時(shí)間格式為 YYYY-MM-DD HH:mm:ss.MS,默認(rèn)時(shí)間分辨率為毫秒。比如:2017-08-12 18:25:58.128
  • 內(nèi)部函數(shù) now 是客戶端的當(dāng)前時(shí)間
  • 插入記錄時(shí),如果時(shí)間戳為 now,插入數(shù)據(jù)時(shí)使用提交這條記錄的客戶端的當(dāng)前時(shí)間
  • Epoch Time:時(shí)間戳也可以是一個(gè)長(zhǎng)整數(shù),表示從格林威治時(shí)間 1970-01-01 00:00:00.000 (UTC/GMT) 開始的毫秒數(shù)(相應(yīng)地,如果所在 Database 的時(shí)間精度設(shè)置為“微秒”,則長(zhǎng)整型格式的時(shí)間戳含義也就對(duì)應(yīng)于從格林威治時(shí)間 1970-01-01 00:00:00.000 (UTC/GMT) 開始的微秒數(shù);納秒精度的邏輯也是類似的。)
  • 時(shí)間可以加減,比如 now-2h,表明查詢時(shí)刻向前推 2 個(gè)小時(shí)(最近 2 小時(shí))。數(shù)字后面的時(shí)間單位可以是 b(納秒)、u(微秒)、a(毫秒)、s(秒)、m(分)、h(小時(shí))、d(天)、w(周)。 比如 select * from t1 where ts > now-2w and ts <= now-1w,表示查詢兩周前整整一周的數(shù)據(jù)。在指定降采樣操作(down sampling)的時(shí)間窗口(interval)時(shí),時(shí)間單位還可以使用 n(自然月) 和 y(自然年)。

TDengine 缺省的時(shí)間戳是毫秒精度,但通過在 CREATE DATABASE 時(shí)傳遞的 PRECISION 參數(shù)就可以支持微秒和納秒。(從 2.1.5.0 版本開始支持納秒精度)

CREATE DATABASE db_name PRECISION 'ns';

在TDengine中,普通表的數(shù)據(jù)模型中可使用以下 10 種數(shù)據(jù)類型。

# 類型 Bytes 說明
1 TIMESTAMP 8 時(shí)間戳。缺省精度毫秒,可支持微秒和納秒。從格林威治時(shí)間 1970-01-01 00:00:00.000 (UTC/GMT) 開始,計(jì)時(shí)不能早于該時(shí)間。(從 2.0.18.0 版本開始,已經(jīng)去除了這一時(shí)間范圍限制)(從 2.1.5.0 版本開始支持納秒精度)
2 INT 4 整型,范圍 [-2^31+1, 2^31-1], -2^31 用作 NULL
3 BIGINT 8 長(zhǎng)整型,范圍 [-2^63+1, 2^63-1], -2^63 用于 NULL
4 FLOAT 4 浮點(diǎn)型,有效位數(shù) 6-7,范圍 [-3.4E38, 3.4E38]
5 DOUBLE 8 雙精度浮點(diǎn)型,有效位數(shù) 15-16,范圍 [-1.7E308, 1.7E308]
6 BINARY 自定義 記錄單字節(jié)字符串,建議只用于處理 ASCII 可見字符,中文等多字節(jié)字符需使用 nchar。理論上,最長(zhǎng)可以有 16374 字節(jié)。binary 僅支持字符串輸入,字符串兩端需使用單引號(hào)引用。使用時(shí)須指定大小,如 binary(20) 定義了最長(zhǎng)為 20 個(gè)單字節(jié)字符的字符串,每個(gè)字符占 1 byte 的存儲(chǔ)空間,總共固定占用 20 bytes 的空間,此時(shí)如果用戶字符串超出 20 字節(jié)將會(huì)報(bào)錯(cuò)。對(duì)于字符串內(nèi)的單引號(hào),可以用轉(zhuǎn)義字符反斜線加單引號(hào)來表示,即 \’。
7 SMALLINT 2 短整型, 范圍 [-32767, 32767], -32768 用于 NULL
8 TINYINT 1 單字節(jié)整型,范圍 [-127, 127], -128 用于 NULL
9 BOOL 1 布爾型,{true, false}
10 NCHAR 自定義 記錄包含多字節(jié)字符在內(nèi)的字符串,如中文字符。每個(gè) nchar 字符占用 4 bytes 的存儲(chǔ)空間。字符串兩端使用單引號(hào)引用,字符串內(nèi)的單引號(hào)需用轉(zhuǎn)義字符 \’。nchar 使用時(shí)須指定字符串大小,類型為 nchar(10) 的列表示此列的字符串最多存儲(chǔ) 10 個(gè) nchar 字符,會(huì)固定占用 40 bytes 的空間。如果用戶字符串長(zhǎng)度超出聲明長(zhǎng)度,將會(huì)報(bào)錯(cuò)。
11 JSON json數(shù)據(jù)類型, 只有tag類型可以是json格式

Tips:

  1. TDengine 對(duì) SQL 語句中的英文字符不區(qū)分大小寫,自動(dòng)轉(zhuǎn)化為小寫執(zhí)行。因此用戶大小寫敏感的字符串及密碼,需要使用單引號(hào)將字符串引起來。
  2. 注意,雖然 Binary 類型在底層存儲(chǔ)上支持字節(jié)型的二進(jìn)制字符,但不同編程語言對(duì)二進(jìn)制數(shù)據(jù)的處理方式并不保證一致,因此建議在 Binary 類型中只存儲(chǔ) ASCII 可見字符,而避免存儲(chǔ)不可見字符。多字節(jié)的數(shù)據(jù),例如中文字符,則需要使用 nchar 類型進(jìn)行保存。如果強(qiáng)行使用 Binary 類型保存中文字符,雖然有時(shí)也能正常讀寫,但并不帶有字符集信息,很容易出現(xiàn)數(shù)據(jù)亂碼甚至數(shù)據(jù)損壞等情況。
  3. 注意,SQL語句中的數(shù)值類型將依據(jù)是否存在小數(shù)點(diǎn),或使用科學(xué)計(jì)數(shù)法表示,來判斷數(shù)值類型是否為整型或者浮點(diǎn)型,因此在使用時(shí)要注意相應(yīng)類型越界的情況。例如,9999999999999999999會(huì)認(rèn)為超過長(zhǎng)整型的上邊界而溢出,而9999999999999999999.0會(huì)被認(rèn)為是有效的浮點(diǎn)數(shù)。

數(shù)據(jù)庫(kù)管理

  • 創(chuàng)建數(shù)據(jù)庫(kù)

    CREATE DATABASE [IF NOT EXISTS] db_name [KEEP keep] [DAYS days] [UPDATE 1];

    說明:

    1) KEEP是該數(shù)據(jù)庫(kù)的數(shù)據(jù)保留多長(zhǎng)天數(shù),缺省是3650天(10年),數(shù)據(jù)庫(kù)會(huì)自動(dòng)刪除超過時(shí)限的數(shù)據(jù);

    2) UPDATE 標(biāo)志數(shù)據(jù)庫(kù)支持更新相同時(shí)間戳數(shù)據(jù);(從 2.1.7.0 版本開始此參數(shù)支持設(shè)為 2,表示允許部分列更新,也即更新數(shù)據(jù)行時(shí)未被設(shè)置的列會(huì)保留原值。)(從 2.0.8.0 版本開始支持此參數(shù)。注意此參數(shù)不能通過 ALTER DATABASE 指令進(jìn)行修改。)

    1) UPDATE設(shè)為0時(shí),表示不允許更新數(shù)據(jù),后發(fā)送的相同時(shí)間戳的數(shù)據(jù)會(huì)被直接丟棄;
    
    2) UPDATE設(shè)為1時(shí),表示更新全部列數(shù)據(jù),即如果更新一個(gè)數(shù)據(jù)行,其中某些列沒有提供取值,那么這些列會(huì)被設(shè)為 NULL;
    
    3) UPDATE設(shè)為2時(shí),表示支持更新部分列數(shù)據(jù),即如果更新一個(gè)數(shù)據(jù)行,其中某些列沒有提供取值,那么這些列會(huì)保持原有數(shù)據(jù)行中的對(duì)應(yīng)值;
    
    4) 更多關(guān)于UPDATE參數(shù)的用法,請(qǐng)參考[FAQ](http://www.fjzmyy.cn/cn/documentation/faq)。

    3) 數(shù)據(jù)庫(kù)名最大長(zhǎng)度為32;

    4) 一條SQL 語句的最大長(zhǎng)度為65480個(gè)字符;

    5) 數(shù)據(jù)庫(kù)還有更多與存儲(chǔ)相關(guān)的配置參數(shù),請(qǐng)參見 服務(wù)端配置 章節(jié)。

  • 顯示系統(tǒng)當(dāng)前參數(shù)

    SHOW VARIABLES;
  • 使用數(shù)據(jù)庫(kù)

    USE db_name;

    使用/切換數(shù)據(jù)庫(kù)(在 RESTful 連接方式下無效)。

  • 刪除數(shù)據(jù)庫(kù)

    DROP DATABASE [IF EXISTS] db_name;

    刪除數(shù)據(jù)庫(kù)。指定 Database 所包含的全部數(shù)據(jù)表將被刪除,謹(jǐn)慎使用!

  • 修改數(shù)據(jù)庫(kù)參數(shù)

    ALTER DATABASE db_name COMP 2;

    COMP 參數(shù)是指修改數(shù)據(jù)庫(kù)文件壓縮標(biāo)志位,缺省值為 2,取值范圍為 [0, 2]。0 表示不壓縮,1 表示一階段壓縮,2 表示兩階段壓縮。

    ALTER DATABASE db_name REPLICA 2;

    REPLICA 參數(shù)是指修改數(shù)據(jù)庫(kù)副本數(shù),取值范圍 [1, 3]。在集群中使用,副本數(shù)必須小于或等于 DNODE 的數(shù)目。

    ALTER DATABASE db_name KEEP 365;

    KEEP 參數(shù)是指修改數(shù)據(jù)文件保存的天數(shù),缺省值為 3650,取值范圍 [days, 365000],必須大于或等于 days 參數(shù)值。

    ALTER DATABASE db_name QUORUM 2;

    QUORUM 參數(shù)是指數(shù)據(jù)寫入成功所需要的確認(rèn)數(shù),取值范圍 [1, 2]。對(duì)于異步復(fù)制,quorum 設(shè)為 1,具有 master 角色的虛擬節(jié)點(diǎn)自己確認(rèn)即可。對(duì)于同步復(fù)制,quorum 設(shè)為 2。原則上,Quorum >= 1 并且 Quorum <= replica(副本數(shù)),這個(gè)參數(shù)在啟動(dòng)一個(gè)同步模塊實(shí)例時(shí)需要提供。

    ALTER DATABASE db_name BLOCKS 100;

    BLOCKS 參數(shù)是每個(gè) VNODE (TSDB) 中有多少 cache 大小的內(nèi)存塊,因此一個(gè) VNODE 的用的內(nèi)存大小粗略為(cache * blocks)。取值范圍 [3, 10000]。

    ALTER DATABASE db_name CACHELAST 0;

    CACHELAST 參數(shù)控制是否在內(nèi)存中緩存子表的最近數(shù)據(jù)。缺省值為 0,取值范圍 [0, 1, 2, 3]。其中 0 表示不緩存,1 表示緩存子表最近一行數(shù)據(jù),2 表示緩存子表每一列的最近的非 NULL 值,3 表示同時(shí)打開緩存最近行和列功能。(從 2.0.11.0 版本開始支持參數(shù)值 [0, 1],從 2.1.2.0 版本開始支持參數(shù)值 [0, 1, 2, 3]。)
    說明:緩存最近行,將顯著改善 LAST_ROW 函數(shù)的性能表現(xiàn);緩存每列的最近非 NULL 值,將顯著改善無特殊影響(WHERE、ORDER BY、GROUP BY、INTERVAL)下的 LAST 函數(shù)的性能表現(xiàn)。

    Tips: 以上所有參數(shù)修改后都可以用show databases來確認(rèn)是否修改成功。另外,從 2.1.3.0 版本開始,修改這些參數(shù)后無需重啟服務(wù)器即可生效。

  • 顯示系統(tǒng)所有數(shù)據(jù)庫(kù)

    SHOW DATABASES;
  • 顯示一個(gè)數(shù)據(jù)庫(kù)的創(chuàng)建語句

    SHOW CREATE DATABASE db_name;

    常用于數(shù)據(jù)庫(kù)遷移。對(duì)一個(gè)已經(jīng)存在的數(shù)據(jù)庫(kù),返回其創(chuàng)建語句;在另一個(gè)集群中執(zhí)行該語句,就能得到一個(gè)設(shè)置完全相同的 Database。

表管理

  • 創(chuàng)建數(shù)據(jù)表

    CREATE TABLE [IF NOT EXISTS] tb_name (timestamp_field_name TIMESTAMP, field1_name data_type1 [, field2_name data_type2 ...]);

    說明:

    1) 表的第一個(gè)字段必須是 TIMESTAMP,并且系統(tǒng)自動(dòng)將其設(shè)為主鍵;

    2) 表名最大長(zhǎng)度為 192;

    3) 表的每行長(zhǎng)度不能超過 48K 個(gè)字符(2.1.7.0 之前的版本為 16K,每個(gè) BINARY/NCHAR 類型的列還會(huì)額外占用 2 個(gè) byte 的存儲(chǔ)位置)

    4) 子表名只能由字母、數(shù)字和下劃線組成,且不能以數(shù)字開頭,不區(qū)分大小寫

    5) 使用數(shù)據(jù)類型 binary 或 nchar,需指定其最長(zhǎng)的字節(jié)數(shù),如 binary(20),表示 20 字節(jié);

    6) 為了兼容支持更多形式的表名,TDengine 引入新的轉(zhuǎn)義符 "`",可以讓表名與關(guān)鍵詞不沖突,同時(shí)不受限于上述表名稱合法性約束檢查。但是同樣具有長(zhǎng)度限制要求。使用轉(zhuǎn)義字符以后,不再對(duì)轉(zhuǎn)義字符中的內(nèi)容進(jìn)行大小寫統(tǒng)一。 例如:`aBc` 和 `abc` 是不同的表名,但是 abc 和 aBc 是相同的表名。 需要注意的是轉(zhuǎn)義字符中的內(nèi)容必須是可打印字符。 上述的操作邏輯和約束要求與MySQL數(shù)據(jù)的操作一致。 從 2.3.0.0 版本開始支持這種方式。

  • 以超級(jí)表為模板創(chuàng)建數(shù)據(jù)表

    CREATE TABLE [IF NOT EXISTS] tb_name USING stb_name TAGS (tag_value1, ...);

    以指定的超級(jí)表為模板,指定 TAGS 的值來創(chuàng)建數(shù)據(jù)表。

  • 以超級(jí)表為模板創(chuàng)建數(shù)據(jù)表,并指定具體的 TAGS 列

    CREATE TABLE [IF NOT EXISTS] tb_name USING stb_name (tag_name1, ...) TAGS (tag_value1, ...);

    以指定的超級(jí)表為模板,指定一部分 TAGS 列的值來創(chuàng)建數(shù)據(jù)表(沒被指定的 TAGS 列會(huì)設(shè)為空值)。
    說明:從 2.0.17.0 版本開始支持這種方式。在之前的版本中,不允許指定 TAGS 列,而必須顯式給出所有 TAGS 列的取值。

  • 批量創(chuàng)建數(shù)據(jù)表

    CREATE TABLE [IF NOT EXISTS] tb_name1 USING stb_name TAGS (tag_value1, ...) [IF NOT EXISTS] tb_name2 USING stb_name TAGS (tag_value2, ...) ...;

    以更快的速度批量創(chuàng)建大量數(shù)據(jù)表(服務(wù)器端 2.0.14 及以上版本)。

    說明:

    1)批量建表方式要求數(shù)據(jù)表必須以超級(jí)表為模板。

    2)在不超出 SQL 語句長(zhǎng)度限制的前提下,單條語句中的建表數(shù)量建議控制在 1000~3000 之間,將會(huì)獲得比較理想的建表速度。

  • 刪除數(shù)據(jù)表

    DROP TABLE [IF EXISTS] tb_name;
  • 顯示當(dāng)前數(shù)據(jù)庫(kù)下的所有數(shù)據(jù)表信息

    SHOW TABLES [LIKE tb_name_wildcar];

    顯示當(dāng)前數(shù)據(jù)庫(kù)下的所有數(shù)據(jù)表信息。

  • 顯示一個(gè)數(shù)據(jù)表的創(chuàng)建語句

    SHOW CREATE TABLE tb_name;

    常用于數(shù)據(jù)庫(kù)遷移。對(duì)一個(gè)已經(jīng)存在的數(shù)據(jù)表,返回其創(chuàng)建語句;在另一個(gè)集群中執(zhí)行該語句,就能得到一個(gè)結(jié)構(gòu)完全相同的數(shù)據(jù)表。

  • 在線修改顯示字符寬度

    SET MAX_BINARY_DISPLAY_WIDTH <nn>;

    如顯示的內(nèi)容后面以...結(jié)尾時(shí),表示該內(nèi)容已被截?cái)?,可通過本命令修改顯示字符寬度以顯示完整的內(nèi)容。

  • 獲取表的結(jié)構(gòu)信息

    DESCRIBE tb_name;
  • 表增加列

    ALTER TABLE tb_name ADD COLUMN field_name data_type;

    說明:

    1) 列的最大個(gè)數(shù)為1024,最小個(gè)數(shù)為2;(從 2.1.7.0 版本開始,改為最多允許 4096 列)

    2) 列名最大長(zhǎng)度為64。

  • 表刪除列

    ALTER TABLE tb_name DROP COLUMN field_name; 

    如果表是通過超級(jí)表創(chuàng)建,更改表結(jié)構(gòu)的操作只能對(duì)超級(jí)表進(jìn)行。同時(shí)針對(duì)超級(jí)表的結(jié)構(gòu)更改對(duì)所有通過該結(jié)構(gòu)創(chuàng)建的表生效。對(duì)于不是通過超級(jí)表創(chuàng)建的表,可以直接修改表結(jié)構(gòu)。

  • 表修改列寬

    ALTER TABLE tb_name MODIFY COLUMN field_name data_type(length); 

    如果數(shù)據(jù)列的類型是可變長(zhǎng)格式(BINARY 或 NCHAR),那么可以使用此指令修改其寬度(只能改大,不能改小)。(2.1.3.0 版本新增)
    如果表是通過超級(jí)表創(chuàng)建,更改表結(jié)構(gòu)的操作只能對(duì)超級(jí)表進(jìn)行。同時(shí)針對(duì)超級(jí)表的結(jié)構(gòu)更改對(duì)所有通過該結(jié)構(gòu)創(chuàng)建的表生效。對(duì)于不是通過超級(jí)表創(chuàng)建的表,可以直接修改表結(jié)構(gòu)。

超級(jí)表STable管理

注意:在 2.0.15.0 及以后的版本中,開始支持 STABLE 保留字。也即,在本節(jié)后文的指令說明中,CREATE、DROP、ALTER 三個(gè)指令在老版本中保留字需寫作 TABLE 而不是 STABLE。

  • 創(chuàng)建超級(jí)表

    CREATE STABLE [IF NOT EXISTS] stb_name (timestamp_field_name TIMESTAMP, field1_name data_type1 [, field2_name data_type2 ...]) TAGS (tag1_name tag_type1, tag2_name tag_type2 [, tag3_name tag_type3]);

    創(chuàng)建 STable,與創(chuàng)建表的 SQL 語法相似,但需要指定 TAGS 字段的名稱和類型。

    說明:

    1) TAGS 列的數(shù)據(jù)類型不能是 timestamp 類型;(從 2.1.3.0 版本開始,TAGS 列中支持使用 timestamp 類型,但需注意在 TAGS 中的 timestamp 列寫入數(shù)據(jù)時(shí)需要提供給定值,而暫不支持四則運(yùn)算,例如 NOW + 10s 這類表達(dá)式)

    2) TAGS 列名不能與其他列名相同;

    3) TAGS 列名不能為預(yù)留關(guān)鍵字(參見:參數(shù)限制與保留關(guān)鍵字 章節(jié));

    4) TAGS 最多允許 128 個(gè),至少 1 個(gè),總長(zhǎng)度不超過 16 KB。

  • 刪除超級(jí)表

    DROP STABLE [IF EXISTS] stb_name;

    刪除 STable 會(huì)自動(dòng)刪除通過 STable 創(chuàng)建的子表。

  • 顯示當(dāng)前數(shù)據(jù)庫(kù)下的所有超級(jí)表信息

    SHOW STABLES [LIKE tb_name_wildcard];

    查看數(shù)據(jù)庫(kù)內(nèi)全部 STable,及其相關(guān)信息,包括 STable 的名稱、創(chuàng)建時(shí)間、列數(shù)量、標(biāo)簽(TAG)數(shù)量、通過該 STable 建表的數(shù)量。

  • 顯示一個(gè)超級(jí)表的創(chuàng)建語句

    SHOW CREATE STABLE stb_name;

    常用于數(shù)據(jù)庫(kù)遷移。對(duì)一個(gè)已經(jīng)存在的超級(jí)表,返回其創(chuàng)建語句;在另一個(gè)集群中執(zhí)行該語句,就能得到一個(gè)結(jié)構(gòu)完全相同的超級(jí)表。

  • 獲取超級(jí)表的結(jié)構(gòu)信息

    DESCRIBE stb_name;
  • 超級(jí)表增加列

    ALTER STABLE stb_name ADD COLUMN field_name data_type;
  • 超級(jí)表刪除列

    ALTER STABLE stb_name DROP COLUMN field_name; 
  • 超級(jí)表修改列寬

    ALTER STABLE stb_name MODIFY COLUMN field_name data_type(length); 

    如果數(shù)據(jù)列的類型是可變長(zhǎng)格式(BINARY 或 NCHAR),那么可以使用此指令修改其寬度(只能改大,不能改?。?。(2.1.3.0 版本新增)

超級(jí)表 STable 中 TAG 管理

  • 添加標(biāo)簽

    ALTER STABLE stb_name ADD TAG new_tag_name tag_type;

    為 STable 增加一個(gè)新的標(biāo)簽,并指定新標(biāo)簽的類型。標(biāo)簽總數(shù)不能超過 128 個(gè),總長(zhǎng)度不超過 16K 個(gè)字符。

  • 刪除標(biāo)簽

    ALTER STABLE stb_name DROP TAG tag_name;

    刪除超級(jí)表的一個(gè)標(biāo)簽,從超級(jí)表刪除某個(gè)標(biāo)簽后,該超級(jí)表下的所有子表也會(huì)自動(dòng)刪除該標(biāo)簽。

  • 修改標(biāo)簽名

    ALTER STABLE stb_name CHANGE TAG old_tag_name new_tag_name;

    修改超級(jí)表的標(biāo)簽名,從超級(jí)表修改某個(gè)標(biāo)簽名后,該超級(jí)表下的所有子表也會(huì)自動(dòng)更新該標(biāo)簽名。

  • 修改標(biāo)簽列寬度

    ALTER STABLE stb_name MODIFY TAG tag_name data_type(length); 

    如果標(biāo)簽的類型是可變長(zhǎng)格式(BINARY 或 NCHAR),那么可以使用此指令修改其寬度(只能改大,不能改?。?。(2.1.3.0 版本新增)

  • 修改子表標(biāo)簽值

    ALTER TABLE tb_name SET TAG tag_name=new_tag_value;

    說明:除了更新標(biāo)簽的值的操作是針對(duì)子表進(jìn)行,其他所有的標(biāo)簽操作(添加標(biāo)簽、刪除標(biāo)簽等)均只能作用于 STable,不能對(duì)單個(gè)子表操作。對(duì) STable 添加標(biāo)簽以后,依托于該 STable 建立的所有表將自動(dòng)增加了一個(gè)標(biāo)簽,所有新增標(biāo)簽的默認(rèn)值都是 NULL。

數(shù)據(jù)寫入

寫入語法:

INSERT INTO
    tb_name
        [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
        [(field1_name, ...)]
        VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
    [tb2_name
        [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
        [(field1_name, ...)]
        VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
    ...];

詳細(xì)描述及示例:

  • 插入一條或多條記錄
    指定已經(jīng)創(chuàng)建好的數(shù)據(jù)子表的表名,并通過 VALUES 關(guān)鍵字提供一行或多行數(shù)據(jù),即可向數(shù)據(jù)庫(kù)寫入這些數(shù)據(jù)。例如,執(zhí)行如下語句可以寫入一行記錄:

    INSERT INTO d1001 VALUES (NOW, 10.2, 219, 0.32);

    或者,可以通過如下語句寫入兩行記錄:

    INSERT INTO d1001 VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32) (1626164208000, 10.15, 217, 0.33);

    注意:
    1)在第二個(gè)例子中,兩行記錄的首列時(shí)間戳使用了不同格式的寫法。其中字符串格式的時(shí)間戳寫法不受所在 DATABASE 的時(shí)間精度設(shè)置影響;而長(zhǎng)整形格式的時(shí)間戳寫法會(huì)受到所在 DATABASE 的時(shí)間精度設(shè)置影響——例子中的時(shí)間戳在毫秒精度下可以寫作 1626164208000,而如果是在微秒精度設(shè)置下就需要寫為 1626164208000000,納秒精度設(shè)置下需要寫為 1626164208000000000。
    2)在使用“插入多條記錄”方式寫入數(shù)據(jù)時(shí),不能把第一列的時(shí)間戳取值都設(shè)為 NOW,否則會(huì)導(dǎo)致語句中的多條記錄使用相同的時(shí)間戳,于是就可能出現(xiàn)相互覆蓋以致這些數(shù)據(jù)行無法全部被正確保存。其原因在于,NOW 函數(shù)在執(zhí)行中會(huì)被解析為所在 SQL 語句的實(shí)際執(zhí)行時(shí)間,出現(xiàn)在同一語句中的多個(gè) NOW 標(biāo)記也就會(huì)被替換為完全相同的時(shí)間戳取值。
    3)允許插入的最老記錄的時(shí)間戳,是相對(duì)于當(dāng)前服務(wù)器時(shí)間,減去配置的 keep 值(數(shù)據(jù)保留的天數(shù));允許插入的最新記錄的時(shí)間戳,是相對(duì)于當(dāng)前服務(wù)器時(shí)間,加上配置的 days 值(數(shù)據(jù)文件存儲(chǔ)數(shù)據(jù)的時(shí)間跨度,單位為天)。keep 和 days 都是可以在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)指定的,缺省值分別是 3650 天和 10 天。

  • 插入記錄,數(shù)據(jù)對(duì)應(yīng)到指定的列
    向數(shù)據(jù)子表中插入記錄時(shí),無論插入一行還是多行,都可以讓數(shù)據(jù)對(duì)應(yīng)到指定的列。對(duì)于 SQL 語句中沒有出現(xiàn)的列,數(shù)據(jù)庫(kù)將自動(dòng)填充為 NULL。主鍵(時(shí)間戳)不能為 NULL。例如:

    INSERT INTO d1001 (ts, current, phase) VALUES ('2021-07-13 14:06:33.196', 10.27, 0.31);

    說明:如果不指定列,也即使用全列模式——那么在 VALUES 部分提供的數(shù)據(jù),必須為數(shù)據(jù)表的每個(gè)列都顯式地提供數(shù)據(jù)。全列模式寫入速度會(huì)遠(yuǎn)快于指定列,因此建議盡可能采用全列寫入方式,此時(shí)空列可以填入 NULL。

  • 向多個(gè)表插入記錄
    可以在一條語句中,分別向多個(gè)表插入一條或多條記錄,并且也可以在插入過程中指定列。例如:

    INSERT INTO d1001 VALUES ('2021-07-13 14:06:34.630', 10.2, 219, 0.32) ('2021-07-13 14:06:35.779', 10.15, 217, 0.33)
                d1002 (ts, current, phase) VALUES ('2021-07-13 14:06:34.255', 10.27, 0.31);
  • 插入記錄時(shí)自動(dòng)建表
    如果用戶在寫數(shù)據(jù)時(shí)并不確定某個(gè)表是否存在,此時(shí)可以在寫入數(shù)據(jù)時(shí)使用自動(dòng)建表語法來創(chuàng)建不存在的表,若該表已存在則不會(huì)建立新表。自動(dòng)建表時(shí),要求必須以超級(jí)表為模板,并寫明數(shù)據(jù)表的 TAGS 取值。例如:

    INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) VALUES ('2021-07-13 14:06:32.272', 10.2, 219, 0.32);

    也可以在自動(dòng)建表時(shí),只是指定部分 TAGS 列的取值,未被指定的 TAGS 列將置為 NULL。例如:

    INSERT INTO d21001 USING meters (groupId) TAGS (2) VALUES ('2021-07-13 14:06:33.196', 10.15, 217, 0.33);

    自動(dòng)建表語法也支持在一條語句中向多個(gè)表插入記錄。例如:

    INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) VALUES ('2021-07-13 14:06:34.630', 10.2, 219, 0.32) ('2021-07-13 14:06:35.779', 10.15, 217, 0.33)
                d21002 USING meters (groupId) TAGS (2) VALUES ('2021-07-13 14:06:34.255', 10.15, 217, 0.33)
                d21003 USING meters (groupId) TAGS (2) (ts, current, phase) VALUES ('2021-07-13 14:06:34.255', 10.27, 0.31);

    說明:在 2.0.20.5 版本之前,在使用自動(dòng)建表語法并指定列時(shí),子表的列名必須緊跟在子表名稱后面,而不能如例子里那樣放在 TAGS 和 VALUES 之間。從 2.0.20.5 版本開始,兩種寫法都可以,但不能在一條 SQL 語句中混用,否則會(huì)報(bào)語法錯(cuò)誤。

  • 插入來自文件的數(shù)據(jù)記錄
    除了使用 VALUES 關(guān)鍵字插入一行或多行數(shù)據(jù)外,也可以把要寫入的數(shù)據(jù)放在 CSV 文件中(英文逗號(hào)分隔、英文單引號(hào)括住每個(gè)值)供 SQL 指令讀取。其中 CSV 文件無需表頭。例如,如果 /tmp/csvfile.csv 文件的內(nèi)容為:

    '2021-07-13 14:07:34.630', '10.2', '219', '0.32'
    '2021-07-13 14:07:35.779', '10.15', '217', '0.33'

    那么通過如下指令可以把這個(gè)文件中的數(shù)據(jù)寫入子表中:

    INSERT INTO d1001 FILE '/tmp/csvfile.csv';
  • 插入來自文件的數(shù)據(jù)記錄,并自動(dòng)建表
    從 2.1.5.0 版本開始,支持在插入來自 CSV 文件的數(shù)據(jù)時(shí),以超級(jí)表為模板來自動(dòng)創(chuàng)建不存在的數(shù)據(jù)表。例如:

    INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) FILE '/tmp/csvfile.csv';

    也可以在一條語句中向多個(gè)表以自動(dòng)建表的方式插入記錄。例如:

    INSERT INTO d21001 USING meters TAGS ('Beijing.Chaoyang', 2) FILE '/tmp/csvfile_21001.csv'
                d21002 USING meters (groupId) TAGS (2) FILE '/tmp/csvfile_21002.csv';

歷史記錄寫入:可使用IMPORT或者INSERT命令,IMPORT的語法,功能與INSERT完全一樣。

說明:針對(duì) insert 類型的 SQL 語句,我們采用的流式解析策略,在發(fā)現(xiàn)后面的錯(cuò)誤之前,前面正確的部分 SQL 仍會(huì)執(zhí)行。下面的 SQL 中,INSERT 語句是無效的,但是 d1001 仍會(huì)被創(chuàng)建。

taos> CREATE TABLE meters(ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS(location BINARY(30), groupId INT);
Query OK, 0 row(s) affected (0.008245s)

taos> SHOW STABLES;
              name              |      created_time       | columns |  tags  |   tables    |
============================================================================================
 meters                         | 2020-08-06 17:50:27.831 |       4 |      2 |           0 |
Query OK, 1 row(s) in set (0.001029s)

taos> SHOW TABLES;
Query OK, 0 row(s) in set (0.000946s)

taos> INSERT INTO d1001 USING meters TAGS('Beijing.Chaoyang', 2) VALUES('a');

DB error: invalid SQL: 'a' (invalid timestamp) (0.039494s)

taos> SHOW TABLES;
           table_name           |      created_time       | columns |          stable_name           |
======================================================================================================
 d1001                          | 2020-08-06 17:52:02.097 |       4 | meters                         |
Query OK, 1 row(s) in set (0.001091s)

數(shù)據(jù)查詢

查詢語法:

SELECT select_expr [, select_expr ...]
    FROM {tb_name_list}
    [WHERE where_condition]
    [SESSION(ts_col, tol_val)]
    [STATE_WINDOW(col)]
    [INTERVAL(interval_val [, interval_offset]) [SLIDING sliding_val]]
    [FILL(fill_mod_and_val)]
    [GROUP BY col_list]
    [ORDER BY col_list { DESC | ASC }]
    [SLIMIT limit_val [SOFFSET offset_val]]
    [LIMIT limit_val [OFFSET offset_val]]
    [>> export_file];

通配符

通配符 * 可以用于代指全部列。對(duì)于普通表,結(jié)果中只有普通列。

taos> SELECT * FROM d1001;
           ts            |       current        |   voltage   |        phase         |
======================================================================================
 2018-10-03 14:38:05.000 |             10.30000 |         219 |              0.31000 |
 2018-10-03 14:38:15.000 |             12.60000 |         218 |              0.33000 |
 2018-10-03 14:38:16.800 |             12.30000 |         221 |              0.31000 |
Query OK, 3 row(s) in set (0.001165s)

在針對(duì)超級(jí)表,通配符包含 標(biāo)簽列 。

taos> SELECT * FROM meters;
           ts            |       current        |   voltage   |        phase         |            location            |   groupid   |
=====================================================================================================================================
 2018-10-03 14:38:05.500 |             11.80000 |         221 |              0.28000 | Beijing.Haidian                |           2 |
 2018-10-03 14:38:16.600 |             13.40000 |         223 |              0.29000 | Beijing.Haidian                |           2 |
 2018-10-03 14:38:05.000 |             10.80000 |         223 |              0.29000 | Beijing.Haidian                |           3 |
 2018-10-03 14:38:06.500 |             11.50000 |         221 |              0.35000 | Beijing.Haidian                |           3 |
 2018-10-03 14:38:04.000 |             10.20000 |         220 |              0.23000 | Beijing.Chaoyang               |           3 |
 2018-10-03 14:38:16.650 |             10.30000 |         218 |              0.25000 | Beijing.Chaoyang               |           3 |
 2018-10-03 14:38:05.000 |             10.30000 |         219 |              0.31000 | Beijing.Chaoyang               |           2 |
 2018-10-03 14:38:15.000 |             12.60000 |         218 |              0.33000 | Beijing.Chaoyang               |           2 |
 2018-10-03 14:38:16.800 |             12.30000 |         221 |              0.31000 | Beijing.Chaoyang               |           2 |
Query OK, 9 row(s) in set (0.002022s)

通配符支持表名前綴,以下兩個(gè)SQL語句均為返回全部的列:

SELECT * FROM d1001;
SELECT d1001.* FROM d1001;

在JOIN查詢中,帶前綴的*和不帶前綴*返回的結(jié)果有差別, *返回全部表的所有列數(shù)據(jù)(不包含標(biāo)簽),帶前綴的通配符,則只返回該表的列數(shù)據(jù)。

taos> SELECT * FROM d1001, d1003 WHERE d1001.ts=d1003.ts;
           ts            | current |   voltage   |    phase     |           ts            | current |   voltage   |    phase     |
==================================================================================================================================
 2018-10-03 14:38:05.000 | 10.30000|         219 |      0.31000 | 2018-10-03 14:38:05.000 | 10.80000|         223 |      0.29000 |
Query OK, 1 row(s) in set (0.017385s)
taos> SELECT d1001.* FROM d1001,d1003 WHERE d1001.ts = d1003.ts;
           ts            |       current        |   voltage   |        phase         |
======================================================================================
 2018-10-03 14:38:05.000 |             10.30000 |         219 |              0.31000 |
Query OK, 1 row(s) in set (0.020443s)

在使用SQL函數(shù)來進(jìn)行查詢的過程中,部分SQL函數(shù)支持通配符操作。其中的區(qū)別在于: count(*)函數(shù)只返回一列。first、lastlast_row函數(shù)則是返回全部列。

taos> SELECT COUNT(*) FROM d1001;
       count(*)        |
========================
                     3 |
Query OK, 1 row(s) in set (0.001035s)
taos> SELECT FIRST(*) FROM d1001;
        first(ts)        |    first(current)    | first(voltage) |     first(phase)     |
=========================================================================================
 2018-10-03 14:38:05.000 |             10.30000 |            219 |              0.31000 |
Query OK, 1 row(s) in set (0.000849s)

標(biāo)簽列

從 2.0.14 版本開始,支持在普通表的查詢中指定 標(biāo)簽列,且標(biāo)簽列的值會(huì)與普通列的數(shù)據(jù)一起返回。

taos> SELECT location, groupid, current FROM d1001 LIMIT 2;
            location            |   groupid   |       current        |
======================================================================
 Beijing.Chaoyang               |           2 |             10.30000 |
 Beijing.Chaoyang               |           2 |             12.60000 |
Query OK, 2 row(s) in set (0.003112s)

注意:普通表的通配符 * 中并不包含 標(biāo)簽列。

獲取標(biāo)簽列或普通列的去重取值

從 2.0.15.0 版本開始,支持在超級(jí)表查詢標(biāo)簽列時(shí),指定 DISTINCT 關(guān)鍵字,這樣將返回指定標(biāo)簽列的所有不重復(fù)取值。注意,在 2.1.6.0 版本之前,DISTINCT 只支持處理單個(gè)標(biāo)簽列,而從 2.1.6.0 版本開始,DISTINCT 可以對(duì)多個(gè)標(biāo)簽列進(jìn)行處理,輸出這些標(biāo)簽列取值不重復(fù)的組合。

SELECT DISTINCT tag_name [, tag_name ...] FROM stb_name;

從 2.1.7.0 版本開始,DISTINCT 也支持對(duì)數(shù)據(jù)子表或普通表進(jìn)行處理,也即支持獲取單個(gè)普通列的不重復(fù)取值,或多個(gè)普通列取值的不重復(fù)組合。

SELECT DISTINCT col_name [, col_name ...] FROM tb_name;

說明:

  1. cfg 文件中的配置參數(shù) maxNumOfDistinctRes 將對(duì) DISTINCT 能夠輸出的數(shù)據(jù)行數(shù)進(jìn)行限制。其最小值是 100000,最大值是 100000000,默認(rèn)值是 10000000。如果實(shí)際計(jì)算結(jié)果超出了這個(gè)限制,那么會(huì)僅輸出這個(gè)數(shù)量范圍內(nèi)的部分。
  2. 由于浮點(diǎn)數(shù)天然的精度機(jī)制原因,在特定情況下,對(duì) FLOAT 和 DOUBLE 列使用 DISTINCT 并不能保證輸出值的完全唯一性。
  3. 在當(dāng)前版本下,DISTINCT 不能在嵌套查詢的子查詢中使用,也不能與聚合函數(shù)、GROUP BY、或 JOIN 在同一條語句中混用。

結(jié)果集列名

SELECT子句中,如果不指定返回結(jié)果集合的列名,結(jié)果集列名稱默認(rèn)使用SELECT子句中的表達(dá)式名稱作為列名稱。此外,用戶可使用AS來重命名返回結(jié)果集合中列的名稱。例如:

taos> SELECT ts, ts AS primary_key_ts FROM d1001;
           ts            |     primary_key_ts      |
====================================================
 2018-10-03 14:38:05.000 | 2018-10-03 14:38:05.000 |
 2018-10-03 14:38:15.000 | 2018-10-03 14:38:15.000 |
 2018-10-03 14:38:16.800 | 2018-10-03 14:38:16.800 |
Query OK, 3 row(s) in set (0.001191s)

但是針對(duì)first(*)、last(*)last_row(*)不支持針對(duì)單列的重命名。

隱式結(jié)果列

Select_exprs可以是表所屬列的列名,也可以是基于列的函數(shù)表達(dá)式或計(jì)算式,數(shù)量的上限256個(gè)。當(dāng)用戶使用了intervalgroup by tags的子句以后,在最后返回結(jié)果中會(huì)強(qiáng)制返回時(shí)間戳列(第一列)和group by子句中的標(biāo)簽列。后續(xù)的版本中可以支持關(guān)閉group by子句中隱式列的輸出,列輸出完全由select子句控制。

表(超級(jí)表)列表

FROM關(guān)鍵字后面可以是若干個(gè)表(超級(jí)表)列表,也可以是子查詢的結(jié)果。 如果沒有指定用戶的當(dāng)前數(shù)據(jù)庫(kù),可以在表名稱之前使用數(shù)據(jù)庫(kù)的名稱來指定表所屬的數(shù)據(jù)庫(kù)。例如:power.d1001 方式來跨庫(kù)使用表。

SELECT * FROM power.d1001;
------------------------------
USE power;
SELECT * FROM d1001;

特殊功能

部分特殊的查詢功能可以不使用FROM子句執(zhí)行。獲取當(dāng)前所在的數(shù)據(jù)庫(kù) database():

taos> SELECT DATABASE();
           database()           |
=================================
 power                          |
Query OK, 1 row(s) in set (0.000079s)

如果登錄的時(shí)候沒有指定默認(rèn)數(shù)據(jù)庫(kù),且沒有使用USE命令切換數(shù)據(jù),則返回NULL。

taos> SELECT DATABASE();
           database()           |
=================================
 NULL                           |
Query OK, 1 row(s) in set (0.000184s)

獲取服務(wù)器和客戶端版本號(hào):

taos> SELECT CLIENT_VERSION();
 client_version() |
===================
 2.0.0.0          |
Query OK, 1 row(s) in set (0.000070s)

taos> SELECT SERVER_VERSION();
 server_version() |
===================
 2.0.0.0          |
Query OK, 1 row(s) in set (0.000077s)

服務(wù)器狀態(tài)檢測(cè)語句。如果服務(wù)器正常,返回一個(gè)數(shù)字(例如 1)。如果服務(wù)器異常,返回error code。該SQL語法能兼容連接池對(duì)于TDengine狀態(tài)的檢查及第三方工具對(duì)于數(shù)據(jù)庫(kù)服務(wù)器狀態(tài)的檢查。并可以避免出現(xiàn)使用了錯(cuò)誤的心跳檢測(cè)SQL語句導(dǎo)致的連接池連接丟失的問題。

taos> SELECT SERVER_STATUS();
 server_status() |
==================
               1 |
Query OK, 1 row(s) in set (0.000074s)

taos> SELECT SERVER_STATUS() AS status;
   status    |
==============
           1 |
Query OK, 1 row(s) in set (0.000081s)

函數(shù)_block_dist()使用說明
語法

SELECT _block_dist() FROM { tb_name | stb_name }

功能說明:獲得指定的(超級(jí))表的數(shù)據(jù)塊分布信息

返回結(jié)果類型:字符串。

適用數(shù)據(jù)類型:不能輸入任何參數(shù)。

嵌套子查詢支持:不支持子查詢或嵌套查詢。

說明:

返回 FROM 子句中輸入的表或超級(jí)表的數(shù)據(jù)塊分布情況。不支持查詢條件。

返回的結(jié)果是該表或超級(jí)表的數(shù)據(jù)塊所包含的行數(shù)的數(shù)據(jù)分布直方圖。

返回結(jié)果如下:

summary:
5th=[392], 10th=[392], 20th=[392], 30th=[392], 40th=[792], 50th=[792] 60th=[792], 70th=[792], 80th=[792], 90th=[792], 95th=[792], 99th=[792] Min=[392(Rows)] Max=[800(Rows)] Avg=[666(Rows)] Stddev=[2.17] Rows=[2000], Blocks=[3], Size=[5.440(Kb)] Comp=[0.23] RowsInMem=[0] SeekHeaderTime=[1(us)]

上述信息的說明如下:
1、查詢的(超級(jí))表所包含的存儲(chǔ)在文件中的數(shù)據(jù)塊(data block)中所包含的數(shù)據(jù)行的數(shù)量分布直方圖信息:5%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 95%, 99% 的數(shù)值;
2、所有數(shù)據(jù)塊中,包含行數(shù)最少的數(shù)據(jù)塊所包含的行數(shù)量, 其中的 Min 指標(biāo) 392 行。
3、所有數(shù)據(jù)塊中,包含行數(shù)最多的數(shù)據(jù)塊所包含的行數(shù)量, 其中的 Max 指標(biāo) 800 行。
4、所有數(shù)據(jù)塊行數(shù)的算數(shù)平均值 666行(其中的 Avg 項(xiàng))。
5、所有數(shù)據(jù)塊中行數(shù)分布的均方差為 2.17 ( stddev )。
6、數(shù)據(jù)塊包含的行的總數(shù)為 2000 行(Rows)。
7、數(shù)據(jù)塊總數(shù)是 3 個(gè)數(shù)據(jù)塊 (Blocks)。
8、數(shù)據(jù)塊占用磁盤空間大小 5.44 Kb (size)。
9、壓縮后的數(shù)據(jù)塊的大小除以原始數(shù)據(jù)的所獲得的壓縮比例: 23%(Comp),及壓縮后的數(shù)據(jù)規(guī)模是原始數(shù)據(jù)規(guī)模的 23%。
10、內(nèi)存中存在的數(shù)據(jù)行數(shù)是0,表示內(nèi)存中沒有數(shù)據(jù)緩存。
11、獲取數(shù)據(jù)塊信息的過程中讀取頭文件的時(shí)間開銷 1 微秒(SeekHeaderTime)。

支持版本:指定計(jì)算算法的功能從2.1.0.x 版本開始,2.1.0.0之前的版本不支持指定使用算法的功能。

TAOS SQL中特殊關(guān)鍵詞

TBNAME: 在超級(jí)表查詢中可視為一個(gè)特殊的標(biāo)簽,代表查詢涉及的子表名
_c0: 表示表(超級(jí)表)的第一列 _qstart,_qstop,_qduration: 表示查詢過濾窗口的起始,結(jié)束以及持續(xù)時(shí)間(從 2.6.0.0 版本開始支持) _wstart,_wstop,_wduration: 窗口切分聚合查詢(例如 interval/session window/state window)中表示每個(gè)切分窗口的起始,結(jié)束以及持續(xù)時(shí)間(從 2.6.0.0 版本開始支持)

小技巧

獲取一個(gè)超級(jí)表所有的子表名及相關(guān)的標(biāo)簽信息:

SELECT TBNAME, location FROM meters;

統(tǒng)計(jì)超級(jí)表下轄子表數(shù)量:

SELECT COUNT(TBNAME) FROM meters;

以上兩個(gè)查詢均只支持在WHERE條件子句中添加針對(duì)標(biāo)簽(TAGS)的過濾條件。例如:

taos> SELECT TBNAME, location FROM meters;
             tbname             |            location            |
==================================================================
 d1004                          | Beijing.Haidian                |
 d1003                          | Beijing.Haidian                |
 d1002                          | Beijing.Chaoyang               |
 d1001                          | Beijing.Chaoyang               |
Query OK, 4 row(s) in set (0.000881s)

taos> SELECT COUNT(tbname) FROM meters WHERE groupId > 2;
     count(tbname)     |
========================
                     2 |
Query OK, 1 row(s) in set (0.001091s)
  • 可以使用 * 返回所有列,或指定列名??梢詫?duì)數(shù)字列進(jìn)行四則運(yùn)算,可以給輸出的列取列名。
    • 暫不支持含列名的四則運(yùn)算表達(dá)式用于條件過濾算子(例如,不支持 where a*2>6;,但可以寫 where a>6/2;)。
    • 暫不支持含列名的四則運(yùn)算表達(dá)式作為 SQL 函數(shù)的應(yīng)用對(duì)象(例如,不支持 select min(2*a) from t;,但可以寫 select 2*min(a) from t;)。
  • WHERE 語句可以使用各種邏輯判斷來過濾數(shù)字值,或使用通配符來過濾字符串。
  • 輸出結(jié)果缺省按首列時(shí)間戳升序排序,但可以指定按降序排序( _c0 指首列時(shí)間戳)。使用 ORDER BY 對(duì)其他字段進(jìn)行排序,排序結(jié)果順序不確定。
  • 參數(shù) LIMIT 控制輸出條數(shù),OFFSET 指定從第幾條開始輸出。LIMIT/OFFSET 對(duì)結(jié)果集的執(zhí)行順序在 ORDER BY 之后。且 LIMIT 5 OFFSET 2 可以簡(jiǎn)寫為 LIMIT 2, 5
    • 在有 GROUP BY 子句的情況下,LIMIT 參數(shù)控制的是每個(gè)分組中至多允許輸出的條數(shù)。
  • 參數(shù) SLIMIT 控制由 GROUP BY 指令劃分的分組中,至多允許輸出幾個(gè)分組的數(shù)據(jù)。且 SLIMIT 5 SOFFSET 2 可以簡(jiǎn)寫為 SLIMIT 2, 5。
  • 通過 “>>” 輸出結(jié)果可以導(dǎo)出到指定文件。

支持的條件過濾操作

Operation Note Applicable Data Types
> larger than all types except bool
< smaller than all types except bool
>= larger than or equal to all types except bool
<= smaller than or equal to all types except bool
= equal to all types
<> not equal to all types
is [not] null is null or is not null all types
between and within a certain range all types except bool
in match any value in a set all types except first column timestamp
like match a wildcard string binary nchar
match/nmatch filter regex binary nchar
  1. <> 算子也可以寫為 != ,請(qǐng)注意,這個(gè)算子不能用于數(shù)據(jù)表第一列的 timestamp 字段。

  2. like 算子使用通配符字符串進(jìn)行匹配檢查。

    • 在通配符字符串中:'%'(百分號(hào))匹配 0 到任意個(gè)字符;'_'(下劃線)匹配單個(gè)任意ASCII字符。
    • 如果希望匹配字符串中原本就帶有的 _(下劃線)字符,那么可以在通配符字符串中寫作 \_,也即加一個(gè)反斜線來進(jìn)行轉(zhuǎn)義。(從 2.2.0.0 版本開始支持)
    • 通配符字符串最長(zhǎng)不能超過 20 字節(jié)。(從 2.1.6.1 版本開始,通配符字符串的長(zhǎng)度放寬到了 100 字節(jié),并可以通過 taos.cfg 中的 maxWildCardsLength 參數(shù)來配置這一長(zhǎng)度限制。但不建議使用太長(zhǎng)的通配符字符串,將有可能嚴(yán)重影響 LIKE 操作的執(zhí)行性能。)
  3. 同時(shí)進(jìn)行多個(gè)字段的范圍過濾,需要使用關(guān)鍵詞 AND 來連接不同的查詢條件,暫不支持 OR 連接的不同列之間的查詢過濾條件。

    • 從 2.3.0.0 版本開始,已支持完整的同一列和/或不同列間的 AND/OR 運(yùn)算。
  4. 針對(duì)單一字段的過濾,如果是時(shí)間過濾條件,則一條語句中只支持設(shè)定一個(gè);但針對(duì)其他的(普通)列或標(biāo)簽列,則可以使用 OR 關(guān)鍵字進(jìn)行組合條件的查詢過濾。例如: ((value > 20 AND value < 30) OR (value < 12))。

    • 從 2.3.0.0 版本開始,允許使用多個(gè)時(shí)間過濾條件,但首列時(shí)間戳的過濾運(yùn)算結(jié)果只能包含一個(gè)區(qū)間。
  5. 從 2.0.17.0 版本開始,條件過濾開始支持 BETWEEN AND 語法,例如 WHERE col2 BETWEEN 1.5 AND 3.25 表示查詢條件為“1.5 ≤ col2 ≤ 3.25”。

  6. 從 2.1.4.0 版本開始,條件過濾開始支持 IN 算子,例如 WHERE city IN ('Beijing', 'Shanghai')。說明:BOOL 類型寫作 {true, false}{0, 1} 均可,但不能寫作 0、1 之外的整數(shù);FLOAT 和 DOUBLE 類型會(huì)受到浮點(diǎn)數(shù)精度影響,集合內(nèi)的值在精度范圍內(nèi)認(rèn)為和數(shù)據(jù)行的值完全相等才能匹配成功;TIMESTAMP 類型支持非主鍵的列。

  7. 從2.3.0.0版本開始,條件過濾開始支持正則表達(dá)式,關(guān)鍵字 match/nmatch 不區(qū)分大小寫。

    語法

    WHERE (column|tag|tbname) match/MATCH/nmatch/NMATCH regex

    match/MATCH 匹配正則表達(dá)式

    nmatch/NMATCH 不匹配正則表達(dá)式

    正則表達(dá)式規(guī)范

    確保使用的正則表達(dá)式符合POSIX的規(guī)范,具體規(guī)范內(nèi)容可參見 Regular Expressions,目前 TDengine 使用的是 glibc 里面的 regex 實(shí)現(xiàn),使用正則表達(dá)式進(jìn)行 match 時(shí)是區(qū)分大小寫的

    正則表達(dá)使用示例

    taos> select distinct location from meters;
        location     |
    ===================
    beijing          |
    shanghai         |
    Query OK, 2 row(s) in set (0.003513s)
    
    taos> select count(*) from meters;
        count(*)        |
    ========================
                    100000 |
    Query OK, 1 row(s) in set (0.015054s)
    
    taos> select count(*) from meters where location match '^b';
        count(*)        |
    ========================
                    48000 |
    Query OK, 1 row(s) in set (0.006977s)
    
    taos> select count(*) from meters where location nmatch '^b';
        count(*)        |
    ========================
                    52000 |
    Query OK, 1 row(s) in set (0.008188s)

    使用限制

    只能針對(duì)表名 (tbname) 以及binary類型的普通列或標(biāo)簽進(jìn)行正則表達(dá)式過濾。

    正則匹配字符串長(zhǎng)度不能超過 128 字節(jié)??梢酝ㄟ^參數(shù) maxRegexStringLen 設(shè)置和調(diào)整最大允許的正則匹配字符串,該參數(shù)是客戶端配置參數(shù),需要重啟客戶端才能生效。

JOIN 子句

從 2.2.0.0 版本開始,TDengine 對(duì)內(nèi)連接(INNER JOIN)中的自然連接(Natural join)操作實(shí)現(xiàn)了完整的支持。也即支持“普通表與普通表之間”、“超級(jí)表與超級(jí)表之間”、“子查詢與子查詢之間”進(jìn)行自然連接。自然連接與內(nèi)連接的主要區(qū)別是,自然連接要求參與連接的字段在不同的表/超級(jí)表中必須是同名字段。也即,TDengine 在連接關(guān)系的表達(dá)中,要求必須使用同名數(shù)據(jù)列/標(biāo)簽列的相等關(guān)系。

在普通表與普通表之間的 JOIN 操作中,只能使用主鍵時(shí)間戳之間的相等關(guān)系。例如:

SELECT *
FROM temp_tb_1 t1, pressure_tb_1 t2
WHERE t1.ts = t2.ts

在超級(jí)表與超級(jí)表之間的 JOIN 操作中,除了主鍵時(shí)間戳一致的條件外,還要求引入能實(shí)現(xiàn)一一對(duì)應(yīng)的標(biāo)簽列的相等關(guān)系。例如:

SELECT *
FROM temp_stable t1, temp_stable t2
WHERE t1.ts = t2.ts AND t1.deviceid = t2.deviceid AND t1.status=0;

類似地,也可以對(duì)多個(gè)子查詢的查詢結(jié)果進(jìn)行 JOIN 操作。

注意,JOIN 操作存在如下限制要求:

  1. 參與一條語句中 JOIN 操作的表/超級(jí)表最多可以有 10 個(gè)。
  2. 在包含 JOIN 操作的查詢語句中不支持 FILL。
  3. 暫不支持參與 JOIN 操作的表之間聚合后的四則運(yùn)算。
  4. 不支持只對(duì)其中一部分表做 GROUP BY。
  5. JOIN 查詢的不同表的過濾條件之間不能為 OR。
  6. JOIN 查詢要求連接條件不能是普通列,只能針對(duì)標(biāo)簽和主時(shí)間字段列(第一列)。

嵌套查詢

“嵌套查詢”又稱為“子查詢”,也即在一條 SQL 語句中,“內(nèi)層查詢”的計(jì)算結(jié)果可以作為“外層查詢”的計(jì)算對(duì)象來使用。

從 2.2.0.0 版本開始,TDengine 的查詢引擎開始支持在 FROM 子句中使用非關(guān)聯(lián)子查詢(“非關(guān)聯(lián)”的意思是,子查詢不會(huì)用到父查詢中的參數(shù))。也即在普通 SELECT 語句的 tb_name_list 位置,用一個(gè)獨(dú)立的 SELECT 語句來代替(這一 SELECT 語句被包含在英文圓括號(hào)內(nèi)),于是完整的嵌套查詢 SQL 語句形如:

SELECT ... FROM (SELECT ... FROM ...) ...;

說明:

  1. 目前僅支持一層嵌套,也即不能在子查詢中再嵌入子查詢。
  2. 內(nèi)層查詢的返回結(jié)果將作為“虛擬表”供外層查詢使用,此虛擬表可以使用 AS 語法做重命名,以便于外層查詢中方便引用。
  3. 目前不能在“連續(xù)查詢”功能中使用子查詢。
  4. 在內(nèi)層和外層查詢中,都支持普通的表間/超級(jí)表間 JOIN。內(nèi)層查詢的計(jì)算結(jié)果也可以再參與數(shù)據(jù)子表的 JOIN 操作。
  5. 目前內(nèi)層查詢、外層查詢均不支持 UNION 操作。
  6. 內(nèi)層查詢支持的功能特性與非嵌套的查詢語句能力是一致的。
    • 內(nèi)層查詢的 ORDER BY 子句一般沒有意義,建議避免這樣的寫法以免無謂的資源消耗。
  7. 與非嵌套的查詢語句相比,外層查詢所能支持的功能特性存在如下限制:
    • 計(jì)算函數(shù)部分:
      1. 如果內(nèi)層查詢的結(jié)果數(shù)據(jù)未提供時(shí)間戳,那么計(jì)算過程依賴時(shí)間戳的函數(shù)在外層會(huì)無法正常工作。例如:TOP, BOTTOM, FIRST, LAST, DIFF。
      2. 計(jì)算過程需要兩遍掃描的函數(shù),在外層查詢中無法正常工作。例如:此類函數(shù)包括:STDDEV, PERCENTILE。
    • 外層查詢中不支持 IN 算子,但在內(nèi)層中可以使用。
    • 外層查詢不支持 GROUP BY。

UNION ALL 子句

SELECT ...
UNION ALL SELECT ...
[UNION ALL SELECT ...]

TDengine 支持 UNION ALL 操作符。也就是說,如果多個(gè) SELECT 子句返回結(jié)果集的結(jié)構(gòu)完全相同(列名、列類型、列數(shù)、順序),那么可以通過 UNION ALL 把這些結(jié)果集合并到一起。目前只支持 UNION ALL 模式,也即在結(jié)果集的合并過程中是不去重的。在同一個(gè)sql語句中,UNION ALL 最多支持100個(gè)。

SQL 示例

  • 對(duì)于下面的例子,表tb1用以下語句創(chuàng)建:

    CREATE TABLE tb1 (ts TIMESTAMP, col1 INT, col2 FLOAT, col3 BINARY(50));
  • 查詢tb1剛過去的一個(gè)小時(shí)的所有記錄:

    SELECT * FROM tb1 WHERE ts >= NOW - 1h;
  • 查詢表tb1從2018-06-01 08:00:00.000 到2018-06-02 08:00:00.000時(shí)間范圍,并且col3的字符串是'nny'結(jié)尾的記錄,結(jié)果按照時(shí)間戳降序:

    SELECT * FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND ts <= '2018-06-02 08:00:00.000' AND col3 LIKE '%nny' ORDER BY ts DESC;
  • 查詢col1與col2的和,并取名complex, 時(shí)間大于2018-06-01 08:00:00.000, col2大于1.2,結(jié)果輸出僅僅10條記錄,從第5條開始:

    SELECT (col1 + col2) AS 'complex' FROM tb1 WHERE ts > '2018-06-01 08:00:00.000' AND col2 > 1.2 LIMIT 10 OFFSET 5;
  • 查詢過去10分鐘的記錄,col2的值大于3.14,并且將結(jié)果輸出到文件 /home/testoutpu.csv

    SELECT COUNT(*) FROM tb1 WHERE ts >= NOW - 10m AND col2 > 3.14 >> /home/testoutpu.csv;

SQL 函數(shù)

聚合函數(shù)

TDengine支持針對(duì)數(shù)據(jù)的聚合查詢。提供支持的聚合和選擇函數(shù)如下:

  • COUNT

    SELECT COUNT([*|field_name]) FROM tb_name [WHERE clause];

    功能說明:統(tǒng)計(jì)表/超級(jí)表中記錄行數(shù)或某列的非空值個(gè)數(shù)。

    返回結(jié)果數(shù)據(jù)類型:長(zhǎng)整型INT64。

    應(yīng)用字段:應(yīng)用全部字段。

    適用于:表、超級(jí)表。

    說明:

    1)可以使用星號(hào)(*)來替代具體的字段,使用星號(hào)(*)返回全部記錄數(shù)量。

    2)針對(duì)同一表的(不包含NULL值)字段查詢結(jié)果均相同。

    3)如果統(tǒng)計(jì)對(duì)象是具體的列,則返回該列中非NULL值的記錄數(shù)量。

    示例:

    taos> SELECT COUNT(*), COUNT(voltage) FROM meters;
        count(*)        |    count(voltage)     |
    ================================================
                        9 |                     9 |
    Query OK, 1 row(s) in set (0.004475s)
    
    taos> SELECT COUNT(*), COUNT(voltage) FROM d1001;
        count(*)        |    count(voltage)     |
    ================================================
                        3 |                     3 |
    Query OK, 1 row(s) in set (0.001075s)
  • AVG

    SELECT AVG(field_name) FROM tb_name [WHERE clause];

    功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的平均值。

    返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)Double。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool字段。

    適用于:表、超級(jí)表。

    示例:

    taos> SELECT AVG(current), AVG(voltage), AVG(phase) FROM meters;
        avg(current)        |       avg(voltage)        |        avg(phase)         |
    ====================================================================================
                11.466666751 |             220.444444444 |               0.293333333 |
    Query OK, 1 row(s) in set (0.004135s)
    
    taos> SELECT AVG(current), AVG(voltage), AVG(phase) FROM d1001;
        avg(current)        |       avg(voltage)        |        avg(phase)         |
    ====================================================================================
                11.733333588 |             219.333333333 |               0.316666673 |
    Query OK, 1 row(s) in set (0.000943s)
  • TWA

    SELECT TWA(field_name) FROM tb_name WHERE clause;

    功能說明:時(shí)間加權(quán)平均函數(shù)。統(tǒng)計(jì)表中某列在一段時(shí)間內(nèi)的時(shí)間加權(quán)平均。

    返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)Double。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    適用于:表、(超級(jí)表)。

    說明:從 2.1.3.0 版本開始,TWA 函數(shù)可以在由 GROUP BY 劃分出單獨(dú)時(shí)間線的情況下用于超級(jí)表(也即 GROUP BY tbname)。

  • IRATE

    SELECT IRATE(field_name) FROM tb_name WHERE clause;

    功能說明:計(jì)算瞬時(shí)增長(zhǎng)率。使用時(shí)間區(qū)間中最后兩個(gè)樣本數(shù)據(jù)來計(jì)算瞬時(shí)增長(zhǎng)速率;如果這兩個(gè)值呈遞減關(guān)系,那么只取最后一個(gè)數(shù)用于計(jì)算,而不是使用二者差值。

    返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)Double。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    適用于:表、(超級(jí)表)。

    說明:(從 2.1.3.0 版本開始新增此函數(shù))IRATE 可以在由 GROUP BY 劃分出單獨(dú)時(shí)間線的情況下用于超級(jí)表(也即 GROUP BY tbname)。

  • SUM

    SELECT SUM(field_name) FROM tb_name [WHERE clause];

    功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的和。

    返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)Double和長(zhǎng)整型INT64。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級(jí)表。

    示例:

    taos> SELECT SUM(current), SUM(voltage), SUM(phase) FROM meters;
        sum(current)        |     sum(voltage)      |        sum(phase)         |
    ================================================================================
                103.200000763 |                  1984 |               2.640000001 |
    Query OK, 1 row(s) in set (0.001702s)
    
    taos> SELECT SUM(current), SUM(voltage), SUM(phase) FROM d1001;
        sum(current)        |     sum(voltage)      |        sum(phase)         |
    ================================================================================
                35.200000763 |                   658 |               0.950000018 |
    Query OK, 1 row(s) in set (0.000980s)
  • STDDEV

    SELECT STDDEV(field_name) FROM tb_name [WHERE clause];

    功能說明:統(tǒng)計(jì)表中某列的均方差。

    返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)Double。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    適用于:。(從 2.0.15.1 版本開始,本函數(shù)也支持超級(jí)表

    示例:

    taos> SELECT STDDEV(current) FROM d1001;
        stddev(current)      |
    ============================
                1.020892909 |
    Query OK, 1 row(s) in set (0.000915s)
  • LEASTSQUARES

    SELECT LEASTSQUARES(field_name, start_val, step_val) FROM tb_name [WHERE clause];

    功能說明:統(tǒng)計(jì)表中某列的值是主鍵(時(shí)間戳)的擬合直線方程。start_val是自變量初始值,step_val是自變量的步長(zhǎng)值。

    返回結(jié)果數(shù)據(jù)類型:字符串表達(dá)式(斜率, 截距)。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    說明:自變量是時(shí)間戳,因變量是該列的值。

    適用于:。

    示例:

    taos> SELECT LEASTSQUARES(current, 1, 1) FROM d1001;
                leastsquares(current, 1, 1)             |
    =====================================================
    {slop:1.000000, intercept:9.733334}                 |
    Query OK, 1 row(s) in set (0.000921s)
  • MODE

    SELECT MODE(field_name) FROM tb_name [WHERE clause];

    功能說明:返回出現(xiàn)頻率最高的值,若存在多個(gè)頻率相同的最高值,輸出空。不能匹配標(biāo)簽、時(shí)間戳輸出。

    返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。

    應(yīng)用字段:適合于除時(shí)間主列外的任何類型字段。

    支持的版本:2.6.0.x 之后的版本。

    說明:由于返回?cái)?shù)據(jù)量未知,考慮到內(nèi)存因素,為了函數(shù)可以正常返回結(jié)果,建議不重復(fù)的數(shù)據(jù)量在10萬級(jí)別,否則會(huì)報(bào)錯(cuò)。

    示例:

    taos> select voltage from d002;
        voltage        |
    ========================
           1           |
           1           |
           2           |
           19          |
    Query OK, 4 row(s) in set (0.003545s)
    
    taos> select mode(voltage) from d002;
      mode(voltage)    |
    ========================
           1           |
    Query OK, 1 row(s) in set (0.019393s)
  • HYPERLOGLOG

    SELECT HYPERLOGLOG(field_name) FROM { tb_name | stb_name } [WHERE clause];

    功能說明:

    • 采用hyperloglog算法,返回某列的基數(shù)。該算法在數(shù)據(jù)量很大的情況下,可以明顯降低內(nèi)存的占用,但是求出來的基數(shù)是個(gè)估算值,標(biāo)準(zhǔn)誤差(標(biāo)準(zhǔn)誤差是多次實(shí)驗(yàn),每次的平均數(shù)的標(biāo)準(zhǔn)差,不是與真實(shí)結(jié)果的誤差)為0.81%。
    • 在數(shù)據(jù)量較少的時(shí)候該算法不是很準(zhǔn)確,可以使用select count(data) from (select unique(col) as data from table) 的方法。

    返回結(jié)果類型:整形。

    適用數(shù)據(jù)類型:適合于任何類型字段。

    支持的版本:2.6.0.x 之后的版本。

    示例:

    taos> select dbig from shll;
         dbig          |
    ========================
           1           |
           1           |
           1           |
           NULL        |
           2           |
           19          |
           NULL        |
           9           |
    Query OK, 8 row(s) in set (0.003755s)
    
    taos> select hyperloglog(dbig) from shll;
      hyperloglog(dbig)|
    ========================
           4           |
    Query OK, 1 row(s) in set (0.008388s)

選擇函數(shù)

在使用所有的選擇函數(shù)的時(shí)候,可以同時(shí)指定輸出 ts 列或標(biāo)簽列(包括 tbname),這樣就可以方便地知道被選出的值是源于哪個(gè)數(shù)據(jù)行的。

  • MIN

    SELECT MIN(field_name) FROM {tb_name | stb_name} [WHERE clause];

    功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的值最小值。

    返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級(jí)表。

    示例:

    taos> SELECT MIN(current), MIN(voltage) FROM meters;
        min(current)     | min(voltage) |
    ======================================
                10.20000 |          218 |
    Query OK, 1 row(s) in set (0.001765s)
    
    taos> SELECT MIN(current), MIN(voltage) FROM d1001;
        min(current)     | min(voltage) |
    ======================================
                10.30000 |          218 |
    Query OK, 1 row(s) in set (0.000950s)
  • MAX

    SELECT MAX(field_name) FROM { tb_name | stb_name } [WHERE clause];

    功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的值最大值。

    返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級(jí)表。

    示例:

    taos> SELECT MAX(current), MAX(voltage) FROM meters;
        max(current)     | max(voltage) |
    ======================================
                13.40000 |          223 |
    Query OK, 1 row(s) in set (0.001123s)
    
    taos> SELECT MAX(current), MAX(voltage) FROM d1001;
        max(current)     | max(voltage) |
    ======================================
                12.60000 |          221 |
    Query OK, 1 row(s) in set (0.000987s)
  • FIRST

    SELECT FIRST(field_name) FROM { tb_name | stb_name } [WHERE clause];

    功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的值最先寫入的非NULL值。

    返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。

    應(yīng)用字段:所有字段。

    適用于:表、超級(jí)表。

    說明:

    1)如果要返回各個(gè)列的首個(gè)(時(shí)間戳最?。┓荖ULL值,可以使用FIRST(*);

    2)如果結(jié)果集中的某列全部為NULL值,則該列的返回結(jié)果也是NULL;

    3)如果結(jié)果集中所有列全部為NULL值,則不返回結(jié)果。

    示例:

    taos> SELECT FIRST(*) FROM meters;
            first(ts)        |    first(current)    | first(voltage) |     first(phase)     |
    =========================================================================================
    2018-10-03 14:38:04.000 |             10.20000 |            220 |              0.23000 |
    Query OK, 1 row(s) in set (0.004767s)
    
    taos> SELECT FIRST(current) FROM d1002;
        first(current)    |
    =======================
                10.20000 |
    Query OK, 1 row(s) in set (0.001023s)
  • LAST

    SELECT LAST(field_name) FROM { tb_name | stb_name } [WHERE clause];

    功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的值最后寫入的非 NULL 值。

    返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。

    應(yīng)用字段:所有字段。

    適用于:表、超級(jí)表。

    說明:

    1)如果要返回各個(gè)列的最后(時(shí)間戳最大)一個(gè)非 NULL 值,可以使用 LAST(*);

    2)如果結(jié)果集中的某列全部為 NULL 值,則該列的返回結(jié)果也是 NULL;如果結(jié)果集中所有列全部為 NULL 值,則不返回結(jié)果。

    3)在用于超級(jí)表時(shí),時(shí)間戳完全一樣且同為最大的數(shù)據(jù)行可能有多個(gè),那么會(huì)從中隨機(jī)返回一條,而并不保證多次運(yùn)行所挑選的數(shù)據(jù)行必然一致。

    示例:

    taos> SELECT LAST(*) FROM meters;
            last(ts)         |    last(current)     | last(voltage) |     last(phase)      |
    ========================================================================================
    2018-10-03 14:38:16.800 |             12.30000 |           221 |              0.31000 |
    Query OK, 1 row(s) in set (0.001452s)
    
    taos> SELECT LAST(current) FROM d1002;
        last(current)     |
    =======================
                10.30000 |
    Query OK, 1 row(s) in set (0.000843s)
  • TOP

    SELECT TOP(field_name, K) FROM { tb_name | stb_name } [WHERE clause];

    功能說明: 統(tǒng)計(jì)表/超級(jí)表中某列的值最大 k 個(gè)非 NULL 值。如果多條數(shù)據(jù)取值一樣,全部取用又會(huì)超出 k 條限制時(shí),系統(tǒng)會(huì)從相同值中隨機(jī)選取符合要求的數(shù)量返回。

    返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級(jí)表

    說明:

    1)k值取值范圍1≤k≤100;

    2)系統(tǒng)同時(shí)返回該記錄關(guān)聯(lián)的時(shí)間戳列;

    3)限制:TOP函數(shù)不支持FILL子句。

    示例:

    taos> SELECT TOP(current, 3) FROM meters;
            ts            |   top(current, 3)    |
    =================================================
    2018-10-03 14:38:15.000 |             12.60000 |
    2018-10-03 14:38:16.600 |             13.40000 |
    2018-10-03 14:38:16.800 |             12.30000 |
    Query OK, 3 row(s) in set (0.001548s)
    
    taos> SELECT TOP(current, 2) FROM d1001;
            ts            |   top(current, 2)    |
    =================================================
    2018-10-03 14:38:15.000 |             12.60000 |
    2018-10-03 14:38:16.800 |             12.30000 |
    Query OK, 2 row(s) in set (0.000810s)
  • BOTTOM

    SELECT BOTTOM(field_name, K) FROM { tb_name | stb_name } [WHERE clause];

    功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的值最小 k 個(gè)非 NULL 值。如果多條數(shù)據(jù)取值一樣,全部取用又會(huì)超出 k 條限制時(shí),系統(tǒng)會(huì)從相同值中隨機(jī)選取符合要求的數(shù)量返回。

    返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級(jí)表。

    說明:

    1)k值取值范圍1≤k≤100;

    2)系統(tǒng)同時(shí)返回該記錄關(guān)聯(lián)的時(shí)間戳列;

    3)限制:BOTTOM函數(shù)不支持FILL子句。

    示例:

    taos> SELECT BOTTOM(voltage, 2) FROM meters;
            ts            | bottom(voltage, 2) |
    ===============================================
    2018-10-03 14:38:15.000 |                218 |
    2018-10-03 14:38:16.650 |                218 |
    Query OK, 2 row(s) in set (0.001332s)
    
    taos> SELECT BOTTOM(current, 2) FROM d1001;
            ts            |  bottom(current, 2)  |
    =================================================
    2018-10-03 14:38:05.000 |             10.30000 |
    2018-10-03 14:38:16.800 |             12.30000 |
    Query OK, 2 row(s) in set (0.000793s)
  • PERCENTILE

    SELECT PERCENTILE(field_name, P) FROM { tb_name } [WHERE clause];

    功能說明:統(tǒng)計(jì)表中某列的值百分比分位數(shù)。

    返回結(jié)果數(shù)據(jù)類型: 雙精度浮點(diǎn)數(shù)Double。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    適用于:。

    說明:P值取值范圍0≤P≤100,為0的時(shí)候等同于MIN,為100的時(shí)候等同于MAX。

    示例:

    taos> SELECT PERCENTILE(current, 20) FROM d1001;
    percentile(current, 20)  |
    ============================
                11.100000191 |
    Query OK, 1 row(s) in set (0.000787s)
  • APERCENTILE

    SELECT APERCENTILE(field_name, P[, algo_type]) 
    FROM { tb_name | stb_name } [WHERE clause]

    功能說明:統(tǒng)計(jì)表/超級(jí)表中指定列的值百分比分位數(shù),與PERCENTILE函數(shù)相似,但是返回近似結(jié)果。

    返回結(jié)果數(shù)據(jù)類型: 雙精度浮點(diǎn)數(shù)Double。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級(jí)表。

    說明:
    P值有效取值范圍0≤P≤100,為 0 的時(shí)候等同于 MIN,為 100 的時(shí)候等同于MAX;
    algo_type的有效輸入:defaultt-digest。 用于指定計(jì)算近似分位數(shù)的算法??刹惶峁┑谌齻€(gè)參數(shù)的輸入,此時(shí)將使用 default 的算法進(jìn)行計(jì)算,即 apercentile(column_name, 50, "default") 與 apercentile(column_name, 50) 等價(jià)。當(dāng)使用“t-digest”參數(shù)的時(shí)候,將使用t-digest方式采樣計(jì)算近似分位數(shù)。但該參數(shù)指定計(jì)算算法的功能從2.2.0.x版本開始支持,2.2.0.0之前的版本不支持指定使用算法的功能。

    嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。

    taos> SELECT APERCENTILE(current, 20) FROM d1001;
    apercentile(current, 20)  |
    ============================
                10.300000191 |
    Query OK, 1 row(s) in set (0.000645s)
    
    taos> select apercentile (count, 80, 'default') from stb1;
     apercentile (c0, 80, 'default') |
    ==================================
                 601920857.210056424 |
    Query OK, 1 row(s) in set (0.012363s)
    
    taos> select apercentile (count, 80, 't-digest') from stb1;
     apercentile (c0, 80, 't-digest') |
    ===================================
                  605869120.966666579 |
    Query OK, 1 row(s) in set (0.011639s)
  • LAST_ROW

    SELECT LAST_ROW(field_name) FROM { tb_name | stb_name };

    功能說明:返回表/超級(jí)表的最后一條記錄。

    返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。

    應(yīng)用字段:所有字段。

    適用于:表、超級(jí)表。

    限制:LAST_ROW() 不能與 INTERVAL 一起使用。

    說明:在用于超級(jí)表時(shí),時(shí)間戳完全一樣且同為最大的數(shù)據(jù)行可能有多個(gè),那么會(huì)從中隨機(jī)返回一條,而并不保證多次運(yùn)行所挑選的數(shù)據(jù)行必然一致。

    示例:

    taos> SELECT LAST_ROW(current) FROM meters;
    last_row(current)   |
    =======================
                12.30000 |
    Query OK, 1 row(s) in set (0.001238s)
    
    taos> SELECT LAST_ROW(current) FROM d1002;
    last_row(current)   |
    =======================
                10.30000 |
    Query OK, 1 row(s) in set (0.001042s)
  • INTERP [2.3.1及之后的版本]

    SELECT INTERP(field_name) FROM { tb_name | stb_name } [WHERE where_condition] [ RANGE(timestamp1,timestamp2) ] [EVERY(interval)] [FILL ({ VALUE | PREV | NULL | LINEAR | NEXT})];

    功能說明:返回表/超級(jí)表的指定時(shí)間截面指定列的記錄值(插值)。

    返回結(jié)果數(shù)據(jù)類型:同字段類型。

    應(yīng)用字段:數(shù)值型字段。

    適用于:表、超級(jí)表、嵌套查詢。

    說明: 1)INTERP用于在指定時(shí)間斷面獲取指定列的記錄值,如果該時(shí)間斷面不存在符合條件的行數(shù)據(jù),那么會(huì)根據(jù) FILL 參數(shù)的設(shè)定進(jìn)行插值。

    2)INTERP的輸入數(shù)據(jù)為指定列的數(shù)據(jù),可以通過條件語句(where子句)來對(duì)原始列數(shù)據(jù)進(jìn)行過濾,如果沒有指定過濾條件則輸入為全部數(shù)據(jù)。

    3)INTERP的輸出時(shí)間范圍根據(jù)RANGE(timestamp1,timestamp2)字段來指定,需滿足timestamp1<=timestamp2。其中timestamp1(必選值)為輸出時(shí)間范圍的起始值,即如果timestamp1時(shí)刻符合插值條件則timestamp1為輸出的第一條記錄,timestamp2(必選值)為輸出時(shí)間范圍的結(jié)束值,即輸出的最后一條記錄的timestamp不能大于timestamp2。如果沒有指定RANGE,那么滿足過濾條件的輸入數(shù)據(jù)中第一條記錄的timestamp即為timestamp1,最后一條記錄的timestamp即為timestamp2,同樣也滿足timestamp1 <= timestamp2。

    4)INTERP根據(jù)EVERY字段來確定輸出時(shí)間范圍內(nèi)的結(jié)果條數(shù),即從timestamp1開始每隔固定長(zhǎng)度的時(shí)間(EVERY值)進(jìn)行插值。如果沒有指定EVERY,則默認(rèn)窗口大小為無窮大,即從timestamp1開始只有一個(gè)窗口。

    5)INTERP根據(jù)FILL字段來決定在每個(gè)符合輸出條件的時(shí)刻如何進(jìn)行插值,如果沒有FILL字段則默認(rèn)不插值,即輸出為原始記錄值或不輸出(原始記錄不存在)。

    6)INTERP只能在一個(gè)時(shí)間序列內(nèi)進(jìn)行插值,因此當(dāng)作用于超級(jí)表時(shí)必須跟group by tbname一起使用,當(dāng)作用嵌套查詢外層時(shí)內(nèi)層子查詢不能含GROUP BY信息。

    7)INTERP的插值結(jié)果不受ORDER BY timestamp的影響,ORDER BY timestamp只影響輸出結(jié)果的排序。

    SQL示例(基于文檔中廣泛使用的電表 schema )

    1) 單點(diǎn)線性插值

      taos> SELECT INTERP(current) FROM t1 RANGE('2017-7-14 18:40:00','2017-7-14 18:40:00') FILL(LINEAR);

    2) 在2017-07-14 18:00:00到2017-07-14 19:00:00間每隔5秒鐘進(jìn)行取值(不插值)

      taos> SELECT INTERP(current) FROM t1 RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s);

    3) 在2017-07-14 18:00:00到2017-07-14 19:00:00間每隔5秒鐘進(jìn)行線性插值

       taos> SELECT INTERP(current) FROM t1 RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR);

    4.在所有時(shí)間范圍內(nèi)每隔5秒鐘進(jìn)行向后插值

       taos> SELECT INTERP(current) FROM t1 EVERY(5s) FILL(NEXT);

    5.根據(jù)2017-07-14 17:00:00到2017-07-14 20:00:00間的數(shù)據(jù)進(jìn)行從2017-07-14 18:00:00到2017-07-14 19:00:00間每隔5秒鐘進(jìn)行線性插值

       taos> SELECT INTERP(current) FROM t1 where ts >= '2017-07-14 17:00:00' and ts <= '2017-07-14 20:00:00' RANGE('2017-7-14 18:00:00','2017-7-14 19:00:00') EVERY(5s) FILL(LINEAR);
  • INTERP [2.3.1之前的版本]

    SELECT INTERP(field_name) FROM { tb_name | stb_name } WHERE ts='timestamp' [FILL ({ VALUE | PREV | NULL | LINEAR | NEXT})];

    功能說明:返回表/超級(jí)表的指定時(shí)間截面、指定字段的記錄。

    返回結(jié)果數(shù)據(jù)類型:同字段類型。

    應(yīng)用字段:數(shù)值型字段。

    適用于:表、超級(jí)表。

    說明:(從 2.0.15.0 版本開始新增此函數(shù))
    1)INTERP 必須指定時(shí)間斷面,如果該時(shí)間斷面不存在直接對(duì)應(yīng)的數(shù)據(jù),那么會(huì)根據(jù) FILL 參數(shù)的設(shè)定進(jìn)行插值。此外,條件語句里面可附帶篩選條件,例如標(biāo)簽、tbname。
    2)INTERP 查詢要求查詢的時(shí)間區(qū)間必須位于數(shù)據(jù)集合(表)的所有記錄的時(shí)間范圍之內(nèi)。如果給定的時(shí)間戳位于時(shí)間范圍之外,即使有插值指令,仍然不返回結(jié)果。
    3)單個(gè) INTERP 函數(shù)查詢只能夠針對(duì)一個(gè)時(shí)間點(diǎn)進(jìn)行查詢,如果需要返回等時(shí)間間隔的斷面數(shù)據(jù),可以通過 INTERP 配合 EVERY 的方式來進(jìn)行查詢處理(而不是使用 INTERVAL),其含義是每隔固定長(zhǎng)度的時(shí)間進(jìn)行插值。

    示例:

    taos> SELECT INTERP(*) FROM meters WHERE ts='2017-7-14 18:40:00.004';
           interp(ts)        |   interp(current)    | interp(voltage) |    interp(phase)     |
    ==========================================================================================
     2017-07-14 18:40:00.004 |              9.84020 |             216 |              0.32222 |
    Query OK, 1 row(s) in set (0.002652s)

    如果給定的時(shí)間戳無對(duì)應(yīng)的數(shù)據(jù),在不指定插值生成策略的情況下,不會(huì)返回結(jié)果,如果指定了插值策略,會(huì)根據(jù)插值策略返回結(jié)果。

    taos> SELECT INTERP(*) FROM meters WHERE tbname IN ('d636') AND ts='2017-7-14 18:40:00.005';
    Query OK, 0 row(s) in set (0.004022s)
    
    taos> SELECT INTERP(*) FROM meters WHERE tbname IN ('d636') AND ts='2017-7-14 18:40:00.005' FILL(PREV);
           interp(ts)        |   interp(current)    | interp(voltage) |    interp(phase)     |
    ==========================================================================================
     2017-07-14 18:40:00.005 |              9.88150 |             217 |              0.32500 |
    Query OK, 1 row(s) in set (0.003056s)

    如下所示代碼表示在時(shí)間區(qū)間 ['2017-7-14 18:40:00', '2017-7-14 18:40:00.014'] 中每隔 5 毫秒 進(jìn)行一次斷面計(jì)算。

    taos> SELECT INTERP(current) FROM d636 WHERE ts>='2017-7-14 18:40:00' AND ts<='2017-7-14 18:40:00.014' EVERY(5a);
               ts            |   interp(current)    |
    =================================================
     2017-07-14 18:40:00.000 |             10.04179 |
     2017-07-14 18:40:00.010 |             10.16123 |
    Query OK, 2 row(s) in set (0.003487s)
  • TAIL

    SELECT TAIL(field_name, k, offset_val) FROM {tb_name | stb_name} [WHERE clause];

    功能說明:返回跳過最后 offset_value個(gè),然后取連續(xù) k 個(gè)記錄,不忽略 NULL 值。offset_val 可以不輸入。此時(shí)返回最后的 k 個(gè)記錄。當(dāng)有 offset_val 輸入的情況下,該函數(shù)功能等效于order by ts desc LIMIT k OFFSET offset_val。

    參數(shù)范圍:k: [1,100] offset_val: [0,100]。

    返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。

    應(yīng)用字段:適合于除時(shí)間主列外的任何類型字段。

    適用于:表、超級(jí)表

    支持版本:2.6.0.x 之后的版本。

    示例:

    
    taos> select ts,dbig from tail2;
           ts            |         dbig          |
    ==================================================
    2021-10-15 00:31:33.000 |                     1 |
    2021-10-17 00:31:31.000 |                  NULL |
    2021-12-24 00:31:34.000 |                     2 |
    2022-01-01 08:00:05.000 |                    19 |
    2022-01-01 08:00:06.000 |                  NULL |
    2022-01-01 08:00:07.000 |                     9 |
    Query OK, 6 row(s) in set (0.001952s)
    
    taos> select tail(dbig,2,2) from tail2;
    ts                      |    tail(dbig,2,2)     |
    ==================================================
    2021-12-24 00:31:34.000 |                     2 |
    2022-01-01 08:00:05.000 |                    19 |
    Query OK, 2 row(s) in set (0.002307s)
  • UNIQUE

    SELECT UNIQUE(field_name) FROM {tb_name | stb_name} [WHERE clause];

    功能說明:返回該列的數(shù)值首次出現(xiàn)的值。該函數(shù)功能與 distinct 相似,但是可以匹配標(biāo)簽和時(shí)間戳信息??梢葬槍?duì)除時(shí)間列以外的字段進(jìn)行查詢,可以匹配標(biāo)簽和時(shí)間戳,其中的標(biāo)簽和時(shí)間戳是第一次出現(xiàn)時(shí)刻的標(biāo)簽和時(shí)間戳。

    返回結(jié)果數(shù)據(jù)類型:同應(yīng)用的字段。

    應(yīng)用字段:適合于除時(shí)間類型以外的字段。

    適用于:表、超級(jí)表。

    支持版本:2.6.0.x 之后的版本。

    說明:

    • 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。不能和窗口操作一起使用,例如 interval/state_window/session_window 。
    • 由于返回?cái)?shù)據(jù)量未知,考慮到內(nèi)存因素,為了函數(shù)可以正常返回結(jié)果,建議不重復(fù)的數(shù)據(jù)量在10萬級(jí)別,否則會(huì)報(bào)錯(cuò)。

    示例:

    
    taos> select ts,voltage from unique1;
           ts            |        voltage        |
    ==================================================
    2021-10-17 00:31:31.000 |                     1 |
    2022-01-24 00:31:31.000 |                     1 |
    2021-10-17 00:31:31.000 |                     1 |
    2021-12-24 00:31:31.000 |                     2 |
    2022-01-01 08:00:01.000 |                    19 |
    2021-10-17 00:31:31.000 |                  NULL |
    2022-01-01 08:00:02.000 |                  NULL |
    2022-01-01 08:00:03.000 |                     9 |
    Query OK, 8 row(s) in set (0.003018s)
    
    taos> select unique(voltage) from unique1;
    ts                      |    unique(voltage)    |
    ==================================================
    2021-10-17 00:31:31.000 |                     1 |
    2021-10-17 00:31:31.000 |                  NULL |
    2021-12-24 00:31:31.000 |                     2 |
    2022-01-01 08:00:01.000 |                    19 |
    2022-01-01 08:00:03.000 |                     9 |
    Query OK, 5 row(s) in set (0.108458s)

計(jì)算函數(shù)

  • DIFF

    SELECT {DIFF(field_name, ignore_negative) | DIFF(field_name)} FROM tb_name [WHERE clause];

    功能說明:統(tǒng)計(jì)表中某列的值與前一行對(duì)應(yīng)值的差。 ignore_negative 取值為 0|1 , 可以不填,默認(rèn)值為 0. 不忽略負(fù)值。ignore_negative為1時(shí)表示忽略負(fù)數(shù)。

    返回結(jié)果數(shù)據(jù)類型:同應(yīng)用字段。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    適用于:表、(超級(jí)表)

    說明:輸出結(jié)果行數(shù)是范圍內(nèi)總行數(shù)減一,第一行沒有結(jié)果輸出。從 2.1.3.0 版本開始,DIFF 函數(shù)可以在由 GROUP BY 劃分出單獨(dú)時(shí)間線的情況下用于超級(jí)表(也即 GROUP BY tbname)。從2.6.0開始,DIFF函數(shù)支持ignore_negative參數(shù)

    示例:

    taos> SELECT DIFF(current) FROM d1001;
            ts            |    diff(current)     |
    =================================================
    2018-10-03 14:38:15.000 |              2.30000 |
    2018-10-03 14:38:16.800 |             -0.30000 |
    Query OK, 2 row(s) in set (0.001162s)
  • DERIVATIVE

    SELECT DERIVATIVE(field_name, time_interval, ignore_negative) FROM tb_name [WHERE clause];

    功能說明:統(tǒng)計(jì)表中某列數(shù)值的單位變化率。其中單位時(shí)間區(qū)間的長(zhǎng)度可以通過 time_interval 參數(shù)指定,最小可以是 1 秒(1s);ignore_negative 參數(shù)的值可以是 0 或 1,為 1 時(shí)表示忽略負(fù)值。

    返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)。

    應(yīng)用字段:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段。

    適用于:表、(超級(jí)表)

    說明:(從 2.1.3.0 版本開始新增此函數(shù))輸出結(jié)果行數(shù)是范圍內(nèi)總行數(shù)減一,第一行沒有結(jié)果輸出。DERIVATIVE 函數(shù)可以在由 GROUP BY 劃分出單獨(dú)時(shí)間線的情況下用于超級(jí)表(也即 GROUP BY tbname)。

    示例:

    taos> select derivative(current, 10m, 0) from t1;
               ts            | derivative(current, 10m, 0) |
    ========================================================
     2021-08-20 10:11:22.790 |                 0.500000000 |
     2021-08-20 11:11:22.791 |                 0.166666620 |
     2021-08-20 12:11:22.791 |                 0.000000000 |
     2021-08-20 13:11:22.792 |                 0.166666620 |
     2021-08-20 14:11:22.792 |                -0.666666667 |
    Query OK, 5 row(s) in set (0.004883s)
  • SPREAD

    SELECT SPREAD(field_name) FROM { tb_name | stb_name } [WHERE clause];

    功能說明:統(tǒng)計(jì)表/超級(jí)表中某列的最大值和最小值之差。

    返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)。

    應(yīng)用字段:不能應(yīng)用在binary、nchar、bool類型字段。

    適用于:表、超級(jí)表。

    說明:可用于TIMESTAMP字段,此時(shí)表示記錄的時(shí)間覆蓋范圍。

    示例:

    taos> SELECT SPREAD(voltage) FROM meters;
        spread(voltage)      |
    ============================
                5.000000000 |
    Query OK, 1 row(s) in set (0.001792s)
    
    taos> SELECT SPREAD(voltage) FROM d1001;
        spread(voltage)      |
    ============================
                3.000000000 |
    Query OK, 1 row(s) in set (0.000836s)
  • CEIL

    SELECT CEIL(field_name) FROM { tb_name | stb_name } [WHERE clause];

    功能說明:獲得指定列的向上取整數(shù)的結(jié)果。

    返回結(jié)果類型:與指定列的原始數(shù)據(jù)類型一致。例如,如果指定列的原始數(shù)據(jù)類型為 Float,那么返回的數(shù)據(jù)類型也為 Float;如果指定列的原始數(shù)據(jù)類型為 Double,那么返回的數(shù)據(jù)類型也為 Double。

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列,無論 tag 列的類型是什么類型。

    嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。

    說明: 支持 +、-、*、/ 運(yùn)算,如 ceil(col1) + ceil(col2)。 只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。

  • FLOOR

    SELECT FLOOR(field_name) FROM { tb_name | stb_name } [WHERE clause];

    功能說明:獲得指定列的向下取整數(shù)的結(jié)果。
    其他使用說明參見CEIL函數(shù)描述。

  • ROUND

    SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];

    功能說明:獲得指定列的四舍五入的結(jié)果。
    其他使用說明參見CEIL函數(shù)描述。

  • CSUM

    SELECT CSUM(field_name) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:累加和(Cumulative sum),輸出行與輸入行數(shù)相同。

    返回結(jié)果類型: 輸入列如果是整數(shù)類型返回值為長(zhǎng)整型 (int64_t),浮點(diǎn)數(shù)返回值為雙精度浮點(diǎn)數(shù)(Double)。無符號(hào)整數(shù)類型返回值為無符號(hào)長(zhǎng)整型(uint64_t)。 返回結(jié)果中同時(shí)帶有每行記錄對(duì)應(yīng)的時(shí)間戳。

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在標(biāo)簽之上。

    嵌套子查詢支持: 適用于內(nèi)層查詢和外層查詢。

    補(bǔ)充說明: 不支持 +、-、*、/ 運(yùn)算,如 csum(col1) + csum(col2)。只能與聚合(Aggregation)函數(shù)一起使用。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 使用在超級(jí)表上的時(shí)候,需要搭配 Group by tbname使用,將結(jié)果強(qiáng)制規(guī)約到單個(gè)時(shí)間線。

    支持版本: 從2.3.0.x開始支持

  • MAVG

    SELECT MAVG(field_name, K) FROM { tb_name | stb_name } [WHERE clause]

    功能說明: 計(jì)算連續(xù) k 個(gè)值的移動(dòng)平均數(shù)(moving average)。如果輸入行數(shù)小于 k,則無結(jié)果輸出。參數(shù) k 的合法輸入范圍是 1≤ k ≤ 1000。

    返回結(jié)果類型: 返回雙精度浮點(diǎn)數(shù)類型。

    適用數(shù)據(jù)類型: 不能應(yīng)用在 timestamp、binary、nchar、bool 類型上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在標(biāo)簽之上。

    嵌套子查詢支持: 適用于內(nèi)層查詢和外層查詢。

    補(bǔ)充說明: 不支持 +、-、*、/ 運(yùn)算,如 mavg(col1, k1) + mavg(col2, k1); 只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用;該函數(shù)可以應(yīng)用在普通表和超級(jí)表上;使用在超級(jí)表上的時(shí)候,需要搭配 Group by tbname使用,將結(jié)果強(qiáng)制規(guī)約到單個(gè)時(shí)間線。

    支持版本: 從2.3.0.x開始支持

  • SAMPLE

    SELECT SAMPLE(field_name, K) FROM { tb_name | stb_name } [WHERE clause]

    功能說明: 獲取數(shù)據(jù)的 k 個(gè)采樣值。參數(shù) k 的合法輸入范圍是 1≤ k ≤ 1000。

    返回結(jié)果類型: 同原始數(shù)據(jù)類型, 返回結(jié)果中帶有該行記錄的時(shí)間戳。

    適用數(shù)據(jù)類型: 在超級(jí)表查詢中使用時(shí),不能應(yīng)用在標(biāo)簽之上。

    嵌套子查詢支持: 適用于內(nèi)層查詢和外層查詢。

    補(bǔ)充說明: 不能參與表達(dá)式計(jì)算;該函數(shù)可以應(yīng)用在普通表和超級(jí)表上;使用在超級(jí)表上的時(shí)候,需要搭配 Group by tbname 使用,將結(jié)果強(qiáng)制規(guī)約到單個(gè)時(shí)間線。

    支持版本: 從2.3.0.x開始支持

  • ASIN

    SELECT ASIN(field_name) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:獲得指定列的反正弦結(jié)果

    返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列

    嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。

    使用說明:

    只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。

    該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。

    版本2.6.0.x后支持

  • ACOS

    SELECT ACOS(field_name) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:獲得指定列的反余弦結(jié)果

    返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列

    嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。

    使用說明:

    只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。

    該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。

    版本2.6.0.x后支持

  • ATAN

    SELECT ATAN(field_name) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:獲得指定列的反正切結(jié)果

    返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列

    嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。

    使用說明:

    只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。

    該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。

    版本2.6.0.x后支持

  • SIN

    SELECT SIN(field_name) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:獲得指定列的正弦結(jié)果

    返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列

    嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。

    使用說明:

    只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。

    該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。

    版本2.6.0.x后支持

  • COS

    SELECT COS(field_name) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:獲得指定列的余弦結(jié)果

    返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列

    嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。

    使用說明:

    只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。

    該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。

    版本2.6.0.x后支持

  • TAN

    SELECT TAN(field_name) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:獲得指定列的正切結(jié)果

    返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列

    嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。

    使用說明:

    只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。

    該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。

    版本2.6.0.x后支持

  • POW

    SELECT POW(field_name, power) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:獲得指定列的指數(shù)為power的冪

    返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列

    嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。

    使用說明:

    只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。

    該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。

    版本2.6.0.x后支持

  • LOG

    SELECT LOG(field_name, base) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:獲得指定列對(duì)于底數(shù)base的對(duì)數(shù)

    返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列

    嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。

    使用說明:

    只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。

    該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。

    版本2.6.0.x后支持

  • ABS

    SELECT ABS(field_name) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:獲得指定列的絕對(duì)值

    返回結(jié)果類型:如果輸入值為整數(shù),輸出值是UBIGINT類型。如果輸入值是FLOAT/DOUBLE數(shù)據(jù)類型,輸出值是DOUBLE數(shù)據(jù)類型。

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列

    嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。

    使用說明:

    只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。

    該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。

    版本2.6.0.x后支持

  • SQRT

    SELECT SQRT(field_name) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:獲得指定列的平方根

    返回結(jié)果類型:DOUBLE。如果輸入值為NULL,輸出值也為NULL

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上;在超級(jí)表查詢中使用時(shí),不能應(yīng)用在 tag 列

    嵌套子查詢支持:適用于內(nèi)層查詢和外層查詢。

    使用說明:

    只能與普通列,選擇(Selection)、投影(Projection)函數(shù)一起使用,不能與聚合(Aggregation)函數(shù)一起使用。

    該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。

    版本2.6.0.x后支持

  • CAST

    SELECT CAST(expression AS type_name) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:數(shù)據(jù)類型轉(zhuǎn)換函數(shù),輸入?yún)?shù)expression支持普通列、常量、標(biāo)量函數(shù)及它們之間的四則運(yùn)算,不支持tag列,只適用于select子句中。

    返回結(jié)果類型:CAST中指定的類型(type_name)。

    適用數(shù)據(jù)類型:輸入?yún)?shù)expression的類型可以是除JSON外目前所有類型字段(BOOL/TINYINT/SMALLINT/INT/BIGINT/FLOAT/DOUBLE/BINARY(M)/TIMESTAMP/NCHAR(M)/TINYINT UNSIGNED/SMALLINT UNSIGNED/INT UNSIGNED/BIGINT UNSIGNED); 輸出目標(biāo)類型只支持BIGINT/BINARY(N)/TIMESTAMP/NCHAR(N)/BIGINT UNSIGNED。

    說明:

    對(duì)于不能支持的類型轉(zhuǎn)換會(huì)直接報(bào)錯(cuò)。

    如果輸入值為NULL則輸出值也為NULL。

    對(duì)于類型支持但某些值無法正確轉(zhuǎn)換的情況對(duì)應(yīng)的轉(zhuǎn)換后的值以轉(zhuǎn)換函數(shù)輸出為準(zhǔn)。目前可能遇到的幾種情況: 1)BINARY/NCHAR轉(zhuǎn)BIGINT/BIGINT UNSIGNED時(shí)可能出現(xiàn)的無效字符情況,例如"a"可能轉(zhuǎn)為0。 2)有符號(hào)數(shù)或TIMESTAMP轉(zhuǎn)BIGINT UNSIGNED可能遇到的溢出問題。 3)BIGINT UNSIGNED轉(zhuǎn)BIGINT可能遇到的溢出問題。 4)FLOAT/DOUBLE轉(zhuǎn)BIGINT/BIGINT UNSIGNED可能遇到的溢出問題。 版本2.6.0.x后支持

  • CONCAT

    SELECT CONCAT(str1|column1, str2|column2, ...) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:字符串連接函數(shù)。

    返回結(jié)果類型:同輸入?yún)?shù)類型,BINARY或者NCHAR。

    適用數(shù)據(jù)類型:輸入?yún)?shù)或者全部是BINARY格式的字符串或者列,或者全部是NCHAR格式的字符串或者列。不能應(yīng)用在TAG列。

    說明:

    如果輸入值為NULL,輸出值為NULL。 該函數(shù)最小參數(shù)個(gè)數(shù)為2個(gè),最大參數(shù)個(gè)數(shù)為8個(gè)。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持

  • CONCAT_WS

    SELECT CONCAT_WS(separator, str1|column1, str2|column2, ...) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:帶分隔符的字符串連接函數(shù)。

    返回結(jié)果類型:同輸入?yún)?shù)類型,BINARY或者NCHAR。

    適用數(shù)據(jù)類型:輸入?yún)?shù)或者全部是BINARY格式的字符串或者列,或者全部是NCHAR格式的字符串或者列。不能應(yīng)用在TAG列。

    說明:

    如果separator值為NULL,輸出值為NULL。如果separator值不為NULL,其他輸入為NULL,輸出為空串 該函數(shù)最小參數(shù)個(gè)數(shù)為3個(gè),最大參數(shù)個(gè)數(shù)為9個(gè)。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持

  • LENGTH

    SELECT LENGTH(str|column) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:以字節(jié)計(jì)數(shù)的字符串長(zhǎng)度。

    返回結(jié)果類型:INT。

    適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。

    說明:

    如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持

  • CHAR_LENGTH

    SELECT CHAR_LENGTH(str|column) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:以字符計(jì)數(shù)的字符串長(zhǎng)度。

    返回結(jié)果類型:INT。

    適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。

    說明:

    如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持

  • LOWER

    SELECT LOWER(str|column) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:將字符串參數(shù)值轉(zhuǎn)換為全小寫字母。

    返回結(jié)果類型:同輸入類型。

    適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。

    說明:

    如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持

  • UPPER

    SELECT UPPER(str|column) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:將字符串參數(shù)值轉(zhuǎn)換為全大寫字母。

    返回結(jié)果類型:同輸入類型。

    適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。

    說明:

    如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持

  • LTRIM

    SELECT LTRIM(str|column) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:返回清除左邊空格后的字符串。

    返回結(jié)果類型:同輸入類型。

    適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。

    說明:

    如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持

  • RTRIM

    SELECT RTRIM(str|column) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:返回清除右邊空格后的字符串。

    返回結(jié)果類型:同輸入類型。

    適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。

    說明:

    如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持

  • SUBSTR

    SELECT SUBSTR(str,pos[,len]) FROM { tb_name | stb_name } [WHERE clause]

    功能說明:從源字符串str中的指定位置pos開始取一個(gè)長(zhǎng)度為len的子串并返回。

    返回結(jié)果類型:同輸入類型。

    適用數(shù)據(jù)類型:輸入?yún)?shù)是BINARY類型或者NCHAR類型的字符串或者列。不能應(yīng)用在TAG列。

    說明:

    如果輸入值為NULL,輸出值為NULL。 輸入?yún)?shù)pos可以為正數(shù),也可以為負(fù)數(shù)。如果pos是正數(shù),表示開始位置從字符串開頭正數(shù)計(jì)算。如果pos為負(fù)數(shù),表示開始位置從字符串結(jié)尾倒數(shù)計(jì)算。如果輸入?yún)?shù)len被忽略,返回的子串包含從pos開始的整個(gè)字串。 該函數(shù)可以應(yīng)用在普通表和超級(jí)表上。 該函數(shù)適用于內(nèi)層查詢和外層查詢。 版本2.6.0.x后支持

  • 四則運(yùn)算

    SELECT field_name [+|-|*|/|%][Value|field_name] FROM { tb_name | stb_name }  [WHERE clause];

    功能說明:統(tǒng)計(jì)表/超級(jí)表中某列或多列間的值加、減、乘、除、取余計(jì)算結(jié)果。

    返回結(jié)果數(shù)據(jù)類型:雙精度浮點(diǎn)數(shù)。

    應(yīng)用字段:不能應(yīng)用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級(jí)表

    說明:

    1)支持兩列或多列之間進(jìn)行計(jì)算,可使用括號(hào)控制計(jì)算優(yōu)先級(jí);

    2)NULL字段不參與計(jì)算,如果參與計(jì)算的某行中包含NULL,該行的計(jì)算結(jié)果為NULL。

    taos> SELECT current + voltage * phase FROM d1001;
    (current+(voltage*phase)) |
    ============================
                78.190000713 |
                84.540003240 |
                80.810000718 |
    Query OK, 3 row(s) in set (0.001046s)
  • STATECOUNT

    SELECT STATECOUNT(field_name, oper, val) FROM { tb_name | stb_name } [WHERE clause];

    功能說明:返回滿足某個(gè)條件的連續(xù)記錄的個(gè)數(shù),結(jié)果作為新的一列追加在每行后面。條件根據(jù)參數(shù)計(jì)算,如果條件為true則加1,條件為false則重置為-1,如果數(shù)據(jù)為NULL,跳過該條數(shù)據(jù)。

    參數(shù)范圍:

    • oper : LT (小于)、GT(大于)、LE(小于等于)、GE(大于等于)、NE(不等于)、EQ(等于),不區(qū)分大小寫。
    • val : 數(shù)值型

    返回結(jié)果類型:整形。

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上。

    嵌套子查詢支持:不支持應(yīng)用在子查詢上。

    支持的版本:2.6.0.x 之后的版本。

    說明:

    • 該函數(shù)可以應(yīng)用在普通表上,在由 GROUP BY 劃分出單獨(dú)時(shí)間線的情況下用于超級(jí)表(也即 GROUP BY tbname)

    • 不能和窗口操作一起使用,例如interval/state_window/session_window。

    示例:

    taos> select ts,dbig from statef2;
              ts               |         dbig          |
    ========================================================
    2021-10-15 00:31:33.000000000 |                     1 |
    2021-10-17 00:31:31.000000000 |                  NULL |
    2021-12-24 00:31:34.000000000 |                     2 |
    2022-01-01 08:00:05.000000000 |                    19 |
    2022-01-01 08:00:06.000000000 |                  NULL |
    2022-01-01 08:00:07.000000000 |                     9 |
    Query OK, 6 row(s) in set (0.002977s)
    
    taos> select stateCount(dbig,GT,2) from statef2;
    ts               |         dbig          | statecount(dbig,gt,2) |
    ================================================================================
    2021-10-15 00:31:33.000000000 |                     1 |                    -1 |
    2021-10-17 00:31:31.000000000 |                  NULL |                  NULL |
    2021-12-24 00:31:34.000000000 |                     2 |                    -1 |
    2022-01-01 08:00:05.000000000 |                    19 |                     1 |
    2022-01-01 08:00:06.000000000 |                  NULL |                  NULL |
    2022-01-01 08:00:07.000000000 |                     9 |                     2 |
    Query OK, 6 row(s) in set (0.002791s)
  • STATEDURATION

    SELECT stateDuration(field_name, oper, val, unit) FROM { tb_name | stb_name } [WHERE clause];

    功能說明:返回滿足某個(gè)條件的連續(xù)記錄的時(shí)間長(zhǎng)度,結(jié)果作為新的一列追加在每行后面。條件根據(jù)參數(shù)計(jì)算,如果條件為true則加上兩個(gè)記錄之間的時(shí)間長(zhǎng)度(第一個(gè)滿足條件的記錄時(shí)間長(zhǎng)度記為0),條件為false則重置為-1,如果數(shù)據(jù)為NULL,跳過該條數(shù)據(jù)。

    參數(shù)范圍:

    • oper : LT (小于)、GT(大于)、LE(小于等于)、GE(大于等于)、NE(不等于)、EQ(等于),不區(qū)分大小寫。
    • val : 數(shù)值型
    • unit : 時(shí)間長(zhǎng)度的單位,范圍[1s、1m、1h ],不足一個(gè)單位舍去。默認(rèn)為1s。

    返回結(jié)果類型:整形。

    適用數(shù)據(jù)類型:不能應(yīng)用在 timestamp、binary、nchar、bool 類型字段上。

    嵌套子查詢支持:不支持應(yīng)用在子查詢上。

    支持的版本:2.6.0.x 之后的版本。

    說明:

    • 該函數(shù)可以應(yīng)用在普通表上,在由 GROUP BY 劃分出單獨(dú)時(shí)間線的情況下用于超級(jí)表(也即 GROUP BY tbname)

    • 不能和窗口操作一起使用,例如interval/state_window/session_window。

    示例:

    taos> select ts,dbig from statef2;
              ts               |         dbig          |
    ========================================================
    2021-10-15 00:31:33.000000000 |                     1 |
    2021-10-17 00:31:31.000000000 |                  NULL |
    2021-12-24 00:31:34.000000000 |                     2 |
    2022-01-01 08:00:05.000000000 |                    19 |
    2022-01-01 08:00:06.000000000 |                  NULL |
    2022-01-01 08:00:07.000000000 |                     9 |
    Query OK, 6 row(s) in set (0.002407s)
    
    taos> select stateDuration(dbig,GT,2) from statef2;
    ts               |         dbig          | stateduration(dbig,gt,2) |
    ===================================================================================
    2021-10-15 00:31:33.000000000 |                     1 |                       -1 |
    2021-10-17 00:31:31.000000000 |                  NULL |                     NULL |
    2021-12-24 00:31:34.000000000 |                     2 |                       -1 |
    2022-01-01 08:00:05.000000000 |                    19 |                        0 |
    2022-01-01 08:00:06.000000000 |                  NULL |                     NULL |
    2022-01-01 08:00:07.000000000 |                     9 |                        2 |
    Query OK, 6 row(s) in set (0.002613s)
  • HISTOGRAM

    SELECT HISTOGRAM(field_name,bin_type, bin_description, normalized) FROM tb_name [WHERE clause];

    功能說明:統(tǒng)計(jì)數(shù)據(jù)按照用戶指定區(qū)間的分布。

    返回結(jié)果數(shù)據(jù)類型:如歸一化參數(shù) normalized 設(shè)置為 1,返回結(jié)果為雙精度浮點(diǎn)類型 DOUBLE,否則為長(zhǎng)整形 INT64。

    應(yīng)用字段:數(shù)值型字段。

    適用于:表、(超級(jí)表)。

    說明: 1)從 2.6.0.0 版本開始支持此函數(shù)。 2)bin_type 用戶指定的分桶類型, 有效輸入類型為"user_input“, ”linear_bin", "log_bin"。 3)bin_description 描述如何生成分桶區(qū)間,針對(duì)三種桶類型,分別為以下描述格式(均為 JSON 格式字符串):

    • "user_input": "[1, 3, 5, 7]" 用戶指定 bin 的具體數(shù)值。

    • "linear_bin": "{"start": 0.0, "width": 5.0, "count": 5, "infinity": true}" "start" 表示數(shù)據(jù)起始點(diǎn),"width" 表示每次 bin 偏移量, "count" 為 bin 的總數(shù),"infinity" 表示是否添加(-inf, inf)作為區(qū)間起點(diǎn)跟終點(diǎn), 生成區(qū)間為[-inf, 0.0, 5.0, 10.0, 15.0, 20.0, +inf]。

    • "log_bin": "{"start":1.0, "factor": 2.0, "count": 5, "infinity": true}" "start" 表示數(shù)據(jù)起始點(diǎn),"factor" 表示按指數(shù)遞增的因子,"count" 為 bin 的總數(shù),"infinity" 表示是否添加(-inf, inf)作為區(qū)間起點(diǎn)跟終點(diǎn), 生成區(qū)間為[-inf, 1.0, 2.0, 4.0, 8.0, 16.0, +inf]。 4)normalized 是否將返回結(jié)果歸一化到 0~1 之間 。有效輸入為 0 和 1。

    示例:

     taos> SELECT HISTOGRAM(voltage, "user_input", "[1,3,5,7]", 1) FROM meters;
         histogram(voltage, "user_input", "[1,3,5,7]", 1) |
     =======================================================
     {"lower_bin":1, "upper_bin":3, "count":0.333333}     |
     {"lower_bin":3, "upper_bin":5, "count":0.333333}     |
     {"lower_bin":5, "upper_bin":7, "count":0.333333}     |
     Query OK, 3 row(s) in set (0.004273s)
    
     taos> SELECT HISTOGRAM(voltage, 'linear_bin', '{"start": 1, "width": 3, "count": 3, "infinity": false}', 0) FROM meters;
         histogram(voltage, 'linear_bin', '{"start": 1, "width": 3, " |
     ===================================================================
     {"lower_bin":1, "upper_bin":4, "count":3}                        |
     {"lower_bin":4, "upper_bin":7, "count":3}                        |
     {"lower_bin":7, "upper_bin":10, "count":3}                       |
     Query OK, 3 row(s) in set (0.004887s)
    
     taos> SELECT HISTOGRAM(voltage, 'log_bin', '{"start": 1, "factor": 3, "count": 3, "infinity": true}', 0) FROM meters;
     histogram(voltage, 'log_bin', '{"start": 1, "factor": 3, "count" |
     ===================================================================
     {"lower_bin":-inf, "upper_bin":1, "count":3}                     |
     {"lower_bin":1, "upper_bin":3, "count":2}                        |
     {"lower_bin":3, "upper_bin":9, "count":6}                        |
     {"lower_bin":9, "upper_bin":27, "count":3}                       |
     {"lower_bin":27, "upper_bin":inf, "count":1}                     |

時(shí)間函數(shù)

從 2.6.0.0 版本開始,TDengine查詢引擎支持以下時(shí)間相關(guān)函數(shù):

  • NOW

    SELECT NOW() FROM { tb_name | stb_name } [WHERE clause];
    SELECT select_expr FROM { tb_name | stb_name } WHERE ts_col cond_operatior NOW();
    INSERT INTO tb_name VALUES (NOW(), ...);

    功能說明:返回客戶端當(dāng)前系統(tǒng)時(shí)間。

    返回結(jié)果數(shù)據(jù)類型:TIMESTAMP 時(shí)間戳類型。

    應(yīng)用字段:在 WHERE 或 INSERT 語句中使用時(shí)只能作用于TIMESTAMP類型的字段。

    適用于:表、超級(jí)表。

    說明: 1)支持時(shí)間加減操作,如NOW() + 1s, 支持的時(shí)間單位如下: b(納秒)、u(微秒)、a(毫秒)、s(秒)、m(分)、h(小時(shí))、d(天)、w(周)。 2)返回的時(shí)間戳精度與當(dāng)前 DATABASE 設(shè)置的時(shí)間精度一致。

    示例:

    taos> SELECT NOW() FROM meters;
              now()          |
    ==========================
      2022-02-02 02:02:02.456 |
    Query OK, 1 row(s) in set (0.002093s)
    
    taos> SELECT NOW() + 1h FROM meters;
           now() + 1h         |
    ==========================
      2022-02-02 03:02:02.456 |
    Query OK, 1 row(s) in set (0.002093s)
    
    taos> SELECT COUNT(voltage) FROM d1001 WHERE ts < NOW();
            count(voltage)       |
    =============================
                               5 |
    Query OK, 5 row(s) in set (0.004475s)
    
    taos> INSERT INTO d1001 VALUES (NOW(), 10.2, 219, 0.32);
    Query OK, 1 of 1 row(s) in database (0.002210s)
  • TODAY

    SELECT TODAY() FROM { tb_name | stb_name } [WHERE clause];
    SELECT select_expr FROM { tb_name | stb_name } WHERE ts_col cond_operatior TODAY()];
    INSERT INTO tb_name VALUES (TODAY(), ...);

    功能說明:返回客戶端當(dāng)日零時(shí)的系統(tǒng)時(shí)間。

    返回結(jié)果數(shù)據(jù)類型:TIMESTAMP 時(shí)間戳類型。

    應(yīng)用字段:在 WHERE 或 INSERT 語句中使用時(shí)只能作用于 TIMESTAMP 類型的字段。

    適用于:表、超級(jí)表。

    說明: 1)支持時(shí)間加減操作,如TODAY() + 1s, 支持的時(shí)間單位如下: b(納秒),u(微秒),a(毫秒),s(秒),m(分),h(小時(shí)),d(天),w(周)。 2)返回的時(shí)間戳精度與當(dāng)前 DATABASE 設(shè)置的時(shí)間精度一致。

    示例:

    taos> SELECT TODAY() FROM meters;
             today()          |
    ==========================
      2022-02-02 00:00:00.000 |
    Query OK, 1 row(s) in set (0.002093s)
    
    taos> SELECT TODAY() + 1h FROM meters;
          today() + 1h        |
    ==========================
      2022-02-02 01:00:00.000 |
    Query OK, 1 row(s) in set (0.002093s)
    
    taos> SELECT COUNT(voltage) FROM d1001 WHERE ts < TODAY();
            count(voltage)       |
    =============================
                               5 |
    Query OK, 5 row(s) in set (0.004475s)
    
    taos> INSERT INTO d1001 VALUES (TODAY(), 10.2, 219, 0.32);
    Query OK, 1 of 1 row(s) in database (0.002210s)
  • TIMEZONE

    SELECT TIMEZONE() FROM { tb_name | stb_name } [WHERE clause];

    功能說明:返回客戶端當(dāng)前時(shí)區(qū)信息。

    返回結(jié)果數(shù)據(jù)類型:BINARY 類型。

    應(yīng)用字段:無

    適用于:表、超級(jí)表。

    示例:

    taos> SELECT TIMEZONE() FROM meters;
               timezone()           |
    =================================
     UTC (UTC, +0000)               |
    Query OK, 1 row(s) in set (0.002093s)
  • TO_ISO8601

    SELECT TO_ISO8601(ts_val | ts_col) FROM { tb_name | stb_name } [WHERE clause];

    功能說明:將 UNIX 時(shí)間戳轉(zhuǎn)換成為 ISO8601 標(biāo)準(zhǔn)的日期時(shí)間格式,并附加客戶端時(shí)區(qū)信息。

    返回結(jié)果數(shù)據(jù)類型:BINARY 類型。

    應(yīng)用字段:UNIX 時(shí)間戳常量或是 TIMESTAMP 類型的列

    適用于:表、超級(jí)表。

    說明:如果輸入是 UNIX 時(shí)間戳常量,返回格式精度由時(shí)間戳的位數(shù)決定,如果輸入是 TIMSTAMP 類型的列,返回格式的時(shí)間戳精度與當(dāng)前 DATABASE 設(shè)置的時(shí)間精度一致。

    示例:

    taos> SELECT TO_ISO8601(1643738400) FROM meters;
       to_iso8601(1643738400)    |
    ==============================
     2022-02-02T02:00:00+0800    |
    
    taos> SELECT TO_ISO8601(ts) FROM meters;
           to_iso8601(ts)        |
    ==============================
     2022-02-02T02:00:00+0800    |
     2022-02-02T02:00:00+0800    |
     2022-02-02T02:00:00+0800    |
    • TO_UNIXTIMESTAMP
      SELECT TO_UNIXTIMESTAMP(datetime_string | ts_col) FROM { tb_name | stb_name } [WHERE clause];

      功能說明:將日期時(shí)間格式的字符串轉(zhuǎn)換成為 UNIX 時(shí)間戳。

    返回結(jié)果數(shù)據(jù)類型:長(zhǎng)整型INT64。

    應(yīng)用字段:字符串常量或是 BINARY/NCHAR 類型的列。

    適用于:表、超級(jí)表

    說明: 1)輸入的日期時(shí)間字符串須符合 ISO8601/RFC3339 標(biāo)準(zhǔn),無法轉(zhuǎn)換的字符串格式將返回0。 2)返回的時(shí)間戳精度與當(dāng)前 DATABASE 設(shè)置的時(shí)間精度一致。

    示例:

    taos> SELECT TO_UNIXTIMESTAMP("2022-02-02T02:00:00.000Z") FROM meters;
    to_unixtimestamp("2022-02-02T02:00:00.000Z") |
    ==============================================
                                   1643767200000 |
    
    taos> SELECT TO_UNIXTIMESTAMP(col_binary) FROM meters;
          to_unixtimestamp(col_binary)     |
    ========================================
                             1643767200000 |
                             1643767200000 |
                             1643767200000 |
    • TIMETRUNCATE
      SELECT TIMETRUNCATE(ts_val | datetime_string | ts_col, time_unit) FROM { tb_name | stb_name } [WHERE clause];

      功能說明:將時(shí)間戳按照指定時(shí)間單位 time_unit 進(jìn)行截?cái)唷?/p>

    返回結(jié)果數(shù)據(jù)類型:TIMESTAMP 時(shí)間戳類型。

    應(yīng)用字段:UNIX 時(shí)間戳,日期時(shí)間格式的字符串,或者 TIMESTAMP 類型的列。

    適用于:表、超級(jí)表。

    說明: 1)支持的時(shí)間單位 time_unit 如下: 1u(微秒),1a(毫秒),1s(秒),1m(分),1h(小時(shí)),1d(天)。 2)返回的時(shí)間戳精度與當(dāng)前 DATABASE 設(shè)置的時(shí)間精度一致。

    示例:

    taos> SELECT TIMETRUNCATE(1643738522000, 1h) FROM meters;
      timetruncate(1643738522000, 1h) |
    ===================================
          2022-02-02 02:00:00.000     |
    Query OK, 1 row(s) in set (0.001499s)
    
    taos> SELECT TIMETRUNCATE("2022-02-02 02:02:02", 1h) FROM meters;
      timetruncate("2022-02-02 02:02:02", 1h) |
    ===========================================
          2022-02-02 02:00:00.000             |
    Query OK, 1 row(s) in set (0.003903s)
    
    taos> SELECT TIMETRUNCATE(ts, 1h) FROM meters;
      timetruncate(ts, 1h)   |
    ==========================
     2022-02-02 02:00:00.000 |
     2022-02-02 02:00:00.000 |
     2022-02-02 02:00:00.000 |
    Query OK, 3 row(s) in set (0.003903s)
    • TIMEDIFF
      SELECT TIMEDIFF(ts_val1 | datetime_string1 | ts_col1, ts_val2 | datetime_string2 | ts_col2 [, time_unit]) FROM { tb_name | stb_name } [WHERE clause];

      功能說明:計(jì)算兩個(gè)時(shí)間戳之間的差值,并近似到時(shí)間單位 time_unit 指定的精度。

    返回結(jié)果數(shù)據(jù)類型:長(zhǎng)整型INT64。

    應(yīng)用字段:UNIX 時(shí)間戳,日期時(shí)間格式的字符串,或者 TIMESTAMP 類型的列。

    適用于:表、超級(jí)表

    說明: 1)支持的時(shí)間單位 time_unit 如下: 1u(微秒),1a(毫秒),1s(秒),1m(分),1h(小時(shí)),1d(天)。 2)如果時(shí)間單位 time_unit 未指定, 返回的時(shí)間差值精度與當(dāng)前 DATABASE 設(shè)置的時(shí)間精度一致。

    示例:

    taos> SELECT TIMEDIFF(1643738400000, 1643742000000) FROM meters;
     timediff(1643738400000, 1643742000000) |
    =========================================
                                    3600000 |
    Query OK, 1 row(s) in set (0.002553s)
    
    taos> SELECT TIMEDIFF(1643738400000, 1643742000000, 1h) FROM meters;
     timediff(1643738400000, 1643742000000, 1h) |
    =============================================
                                              1 |
    Query OK, 1 row(s) in set (0.003726s)
    
    taos> SELECT TIMEDIFF("2022-02-02 03:00:00", "2022-02-02 02:00:00", 1h) FROM meters;
     timediff("2022-02-02 03:00:00", "2022-02-02 02:00:00", 1h) |
    =============================================================
                                                              1 |
    Query OK, 1 row(s) in set (0.001937s)
    
    taos> SELECT TIMEDIFF(ts_col1, ts_col2, 1h) FROM meters;
       timediff(ts_col1, ts_col2, 1h) |
    ===================================
                                    1 |
    Query OK, 1 row(s) in set (0.001937s)

按窗口切分聚合

TDengine 支持按時(shí)間段窗口切分方式進(jìn)行聚合結(jié)果查詢,比如溫度傳感器每秒采集一次數(shù)據(jù),但需查詢每隔 10 分鐘的溫度平均值。這種場(chǎng)景下可以使用窗口子句來獲得需要的查詢結(jié)果。 窗口子句用于針對(duì)查詢的數(shù)據(jù)集合進(jìn)行按照窗口切分成為查詢子集并進(jìn)行聚合,窗口包含時(shí)間窗口(time window)、狀態(tài)窗口(status window)、會(huì)話窗口(session window)三種窗口。其中時(shí)間窗口又可劃分為滑動(dòng)時(shí)間窗口和翻轉(zhuǎn)時(shí)間窗口。

時(shí)間窗口

INTERVAL子句用于產(chǎn)生相等時(shí)間周期的窗口,SLIDING用以指定窗口向前滑動(dòng)的時(shí)間。每次執(zhí)行的查詢是一個(gè)時(shí)間窗口,時(shí)間窗口隨著時(shí)間流動(dòng)向前滑動(dòng)。在定義連續(xù)查詢的時(shí)候需要指定時(shí)間窗口(time window )大小和每次前向增量時(shí)間(forward sliding times)。如圖,[t0s, t0e] ,[t1s , t1e], [t2s, t2e] 是分別是執(zhí)行三次連續(xù)查詢的時(shí)間窗口范圍,窗口的前向滑動(dòng)的時(shí)間范圍sliding time標(biāo)識(shí) 。查詢過濾、聚合等操作按照每個(gè)時(shí)間窗口為獨(dú)立的單位執(zhí)行。當(dāng)SLIDING與INTERVAL相等的時(shí)候,滑動(dòng)窗口即為翻轉(zhuǎn)窗口。

時(shí)間窗口示意圖

INTERVAL和SLIDING子句需要配合聚合和選擇函數(shù)來使用。以下SQL語句非法:

SELECT * FROM temp_table INTERVAL(1S)

SLIDING的向前滑動(dòng)的時(shí)間不能超過一個(gè)窗口的時(shí)間范圍。以下語句非法:

SELECT COUNT(*) FROM temp_table INTERVAL(1D) SLIDING(2D)

當(dāng) SLIDING 與 INTERVAL 取值相等的時(shí)候,滑動(dòng)窗口即為翻轉(zhuǎn)窗口。

  • 聚合時(shí)間段的窗口寬度由關(guān)鍵詞 INTERVAL 指定,最短時(shí)間間隔 10 毫秒(10a);并且支持偏移 offset(偏移必須小于間隔),也即時(shí)間窗口劃分與“UTC 時(shí)刻 0”相比的偏移量。SLIDING 語句用于指定聚合時(shí)間段的前向增量,也即每次窗口向前滑動(dòng)的時(shí)長(zhǎng)。
  • 從 2.1.5.0 版本開始,INTERVAL 語句允許的最短時(shí)間間隔調(diào)整為 1 微秒(1u),當(dāng)然如果所查詢的 DATABASE 的時(shí)間精度設(shè)置為毫秒級(jí),那么允許的最短時(shí)間間隔為 1 毫秒(1a)。
  • 注意:用到 INTERVAL 語句時(shí),除非極特殊的情況,都要求把客戶端和服務(wù)端的 taos.cfg 配置文件中的 timezone 參數(shù)配置為相同的取值,以避免時(shí)間處理函數(shù)頻繁進(jìn)行跨時(shí)區(qū)轉(zhuǎn)換而導(dǎo)致的嚴(yán)重性能影響。

狀態(tài)窗口

使用整數(shù)(布爾值)或字符串來標(biāo)識(shí)產(chǎn)生記錄時(shí)候設(shè)備的狀態(tài)量。產(chǎn)生的記錄如果具有相同的狀態(tài)量數(shù)值則歸屬于同一個(gè)狀態(tài)窗口,數(shù)值改變后該窗口關(guān)閉。如下圖所示,根據(jù)狀態(tài)量確定的狀態(tài)窗口分別是[2019-04-28 14:22:07,2019-04-28 14:22:10]和[2019-04-28 14:22:11,2019-04-28 14:22:12]兩個(gè)。(狀態(tài)窗口暫不支持對(duì)超級(jí)表使用)

時(shí)間窗口示意圖

使用STATE_WINDOW來確定狀態(tài)窗口劃分的列。例如:

SELECT COUNT(*), FIRST(ts), status FROM temp_tb_1 STATE_WINDOW(status)

會(huì)話窗口

會(huì)話窗口根據(jù)記錄的時(shí)間戳主鍵的值來確定是否屬于同一個(gè)會(huì)話。如下圖所示,如果設(shè)置時(shí)間戳的連續(xù)的間隔小于等于12秒,則以下6條記錄構(gòu)成2個(gè)會(huì)話窗口,分別是:[2019-04-28 14:22:10,2019-04-28 14:22:30]和[2019-04-28 14:23:10,2019-04-28 14:23:30]。因?yàn)?019-04-28 14:22:30與2019-04-28 14:23:10之間的時(shí)間間隔是40秒,超過了連續(xù)時(shí)間間隔(12秒)。

時(shí)間窗口示意圖

在tol_value時(shí)間間隔范圍內(nèi)的結(jié)果都認(rèn)為歸屬于同一個(gè)窗口,如果連續(xù)的兩條記錄的時(shí)間超過tol_val,則自動(dòng)開啟下一個(gè)窗口。(會(huì)話窗口暫不支持對(duì)超級(jí)表使用)


SELECT COUNT(*), FIRST(ts) FROM temp_tb_1 SESSION(ts, tol_val)

這種類型的查詢語法如下:

SELECT function_list FROM tb_name
  [WHERE where_condition]
  [SESSION(ts_col, tol_val)]
  [STATE_WINDOW(col)]
  [INTERVAL(interval [, offset]) [SLIDING sliding]]
  [FILL({NONE | VALUE | PREV | NULL | LINEAR | NEXT})]

SELECT function_list FROM stb_name
  [WHERE where_condition]
  [INTERVAL(interval [, offset]) [SLIDING sliding]]
  [FILL({NONE | VALUE | PREV | NULL | LINEAR | NEXT})]
  [GROUP BY tags]
  • 在聚合查詢中,function_list 位置允許使用聚合和選擇函數(shù),并要求每個(gè)函數(shù)僅輸出單個(gè)結(jié)果(例如:COUNT、AVG、SUM、STDDEV、LEASTSQUARES、PERCENTILE、MIN、MAX、FIRST、LAST),而不能使用具有多行輸出結(jié)果的函數(shù)(例如:DIFF 以及四則運(yùn)算)。

  • 此外也 LAST_ROW 查詢也不能與窗口聚合同時(shí)出現(xiàn)。

  • 標(biāo)量函數(shù)(如:CEIL/FLOOR 等)也不能使用在窗口聚合查詢中。

  • WHERE 語句可以指定查詢的起止時(shí)間和其他過濾條件。

  • FILL 語句指定某一窗口區(qū)間數(shù)據(jù)缺失的情況下的填充模式。填充模式包括以下幾種:

    1. 不進(jìn)行填充:NONE(默認(rèn)填充模式)。
    2. VALUE 填充:固定值填充,此時(shí)需要指定填充的數(shù)值。例如:FILL(VALUE, 1.23)。
    3. PREV 填充:使用前一個(gè)非 NULL 值填充數(shù)據(jù)。例如:FILL(PREV)。
    4. NULL 填充:使用 NULL 填充數(shù)據(jù)。例如:FILL(NULL)。
    5. LINEAR 填充:根據(jù)前后距離最近的非 NULL 值做線性插值填充。例如:FILL(LINEAR)。
    6. NEXT 填充:使用下一個(gè)非 NULL 值填充數(shù)據(jù)。例如:FILL(NEXT)。

說明:

  1. 使用 FILL 語句的時(shí)候可能生成大量的填充輸出,務(wù)必指定查詢的時(shí)間區(qū)間。針對(duì)每次查詢,系統(tǒng)可返回不超過 1 千萬條具有插值的結(jié)果。
  2. 在時(shí)間維度聚合中,返回的結(jié)果中時(shí)間序列嚴(yán)格單調(diào)遞增。
  3. 如果查詢對(duì)象是超級(jí)表,則聚合函數(shù)會(huì)作用于該超級(jí)表下滿足值過濾條件的所有表的數(shù)據(jù)。如果查詢中沒有使用 GROUP BY 語句,則返回的結(jié)果按照時(shí)間序列嚴(yán)格單調(diào)遞增;如果查詢中使用了 GROUP BY 語句分組,則返回結(jié)果中每個(gè) GROUP 內(nèi)不按照時(shí)間序列嚴(yán)格單調(diào)遞增。

時(shí)間聚合也常被用于連續(xù)查詢場(chǎng)景,可以參考文檔 連續(xù)查詢(Continuous Query)。

示例: 智能電表的建表語句如下:

CREATE TABLE meters (ts TIMESTAMP, current FLOAT, voltage INT, phase FLOAT) TAGS (location BINARY(64), groupId INT);

針對(duì)智能電表采集的數(shù)據(jù),以 10 分鐘為一個(gè)階段,計(jì)算過去 24 小時(shí)的電流數(shù)據(jù)的平均值、最大值、電流的中位數(shù)。如果沒有計(jì)算值,用前一個(gè)非 NULL 值填充。使用的查詢語句如下:

SELECT AVG(current), MAX(current), APERCENTILE(current, 50) FROM meters
  WHERE ts>=NOW-1d and ts<=now
  INTERVAL(10m)
  FILL(PREV);

TAOS SQL 邊界限制

  • 數(shù)據(jù)庫(kù)名最大長(zhǎng)度為 32。
  • 表名最大長(zhǎng)度為 192。每行數(shù)據(jù)最大長(zhǎng)度 48K 個(gè)字符(2.1.7.0 之前的版本為 16K,每個(gè) BINARY/NCHAR 類型的列還會(huì)額外占用 2 個(gè) byte 的存儲(chǔ)位置)
  • 列名最大長(zhǎng)度為 64,最多允許 1024 列,最少需要 2 列,第一列必須是時(shí)間戳。(從 2.1.7.0 版本開始,改為最多允許 4096 列)
  • 標(biāo)簽名最大長(zhǎng)度為 64,最多允許 128 個(gè),可以 1 個(gè),一個(gè)表中標(biāo)簽值的總長(zhǎng)度不超過 16K 個(gè)字符。
  • SQL 語句最大長(zhǎng)度 1048576 個(gè)字符,也可通過客戶端配置參數(shù) maxSQLLength 修改,取值范圍 65480 ~ 1048576。
  • SELECT 語句的查詢結(jié)果,最多允許返回 1024 列(語句中的函數(shù)調(diào)用可能也會(huì)占用一些列空間),超限時(shí)需要顯式指定較少的返回?cái)?shù)據(jù)列,以避免語句執(zhí)行報(bào)錯(cuò)。(從 2.1.7.0 版本開始,改為最多允許 4096 列)
  • 庫(kù)的數(shù)目,超級(jí)表的數(shù)目、表的數(shù)目,系統(tǒng)不做限制,僅受系統(tǒng)資源限制。

TAOS SQL 其他約定

GROUP BY的限制

TAOS SQL 支持對(duì)標(biāo)簽、TBNAME 進(jìn)行 GROUP BY 操作,也支持普通列進(jìn)行 GROUP BY,前提是:僅限一列且該列的唯一值小于 10 萬個(gè)。注意:group by 不支持float,double 類型。

IS NOT NULL 與不為空的表達(dá)式適用范圍

IS NOT NULL 支持所有類型的列。不為空的表達(dá)式為 <>"",僅對(duì)非數(shù)值類型的列適用。

ORDER BY的限制

  • 非超級(jí)表只能有一個(gè)order by.
  • 超級(jí)表最多兩個(gè)order by, 并且第二個(gè)必須為ts.
  • order by tag,必須和group by tag一起,并且是同一個(gè)tag。 tbname和tag一樣邏輯。 只適用于超級(jí)表
  • order by 普通列,必須和group by一起或者和top/bottom一起,并且是同一個(gè)普通列。 適用于超級(jí)表和普通表。如果同時(shí)存在 group by和 top/bottom一起,order by優(yōu)先必須和group by同一列。
  • order by ts. 適用于超級(jí)表和普通表。
  • order by ts同時(shí)含有g(shù)roup by時(shí) 針對(duì)group內(nèi)部用ts排序

表(列)名合法性說明

TDengine 中的表(列)名命名規(guī)則如下: 只能由字母、數(shù)字、下劃線構(gòu)成,數(shù)字不能在首位,長(zhǎng)度不能超過192字節(jié),不區(qū)分大小寫。這里表名稱不包括數(shù)據(jù)庫(kù)名的前綴和分隔符。

轉(zhuǎn)義后表(列)名規(guī)則: 為了兼容支持更多形式的表(列)名,TDengine 引入新的轉(zhuǎn)義符 "`"??捎米尡砻c關(guān)鍵詞不沖突,同時(shí)不受限于上述表名稱合法性約束檢查,轉(zhuǎn)義符不計(jì)入表名稱的長(zhǎng)度。 轉(zhuǎn)義后的表(列)名同樣受到長(zhǎng)度限制要求,且長(zhǎng)度計(jì)算的時(shí)候不計(jì)算轉(zhuǎn)義符。使用轉(zhuǎn)義字符以后,不再對(duì)轉(zhuǎn)義字符中的內(nèi)容進(jìn)行大小寫統(tǒng)一。

例如: `aBc` 和 `abc` 是不同的表(列)名,但是 abc 和 aBc 是相同的表(列)名。

需要注意的是轉(zhuǎn)義字符中的內(nèi)容必須是可打印字符。

支持版本 支持轉(zhuǎn)義符的功能從 2.3.0.1 版本開始。

Json類型使用說明

  • 語法說明

    1. 創(chuàng)建json類型tag

      create stable s1 (ts timestamp, v1 int) tags (info json)
      
      create table s1_1 using s1 tags ('{"k1": "v1"}')
    2. json取值操作符 ->

      select * from s1 where info->'k1' = 'v1'
      
      select info->'k1' from s1 
    3. json key是否存在操作符 contains

      select * from s1 where info contains 'k2'
      
      select * from s1 where info contains 'k1'
  • 支持的操作

    1. 在where條件中時(shí),支持函數(shù)match/nmatch/between and/like/and/or/is null/is no null,不支持in

      select * from s1 where info->'k1' match 'v*'; 
      
      select * from s1 where info->'k1' like 'v%' and info contains 'k2';
      
      select * from s1 where info is null; 
      
      select * from s1 where info->'k1' is not null
    2. 支持json tag放在group by、order by、join子句、union all以及子查詢中,比如group by json->'key'

    3. 支持distinct操作.

      select distinct info->'k1' from s1
    4. 標(biāo)簽操作

      支持修改json標(biāo)簽值(全量覆蓋)

      支持修改json標(biāo)簽名

      不支持添加json標(biāo)簽、刪除json標(biāo)簽、修改json標(biāo)簽列寬

  • 其他約束條件

    1. 只有標(biāo)簽列可以使用json類型,如果用json標(biāo)簽,標(biāo)簽列只能有一個(gè)。

    2. 長(zhǎng)度限制:json 中key的長(zhǎng)度不能超過256,并且key必須為可打印ascii字符;json字符串總長(zhǎng)度不超過4096個(gè)字節(jié)。

    3. json格式限制:

      1. json輸入字符串可以為空("","\t"," "或null)或object,不能為非空的字符串,布爾型和數(shù)組。
      2. object 可為{},如果object為{},則整個(gè)json串記為空。key可為"",若key為"",則json串中忽略該k-v對(duì)。
      3. value可以為數(shù)字(int/double)或字符串或bool或null,暫不可以為數(shù)組。不允許嵌套。
      4. 若json字符串中出現(xiàn)兩個(gè)相同的key,則第一個(gè)生效。
      5. json字符串里暫不支持轉(zhuǎn)義。
    4. 當(dāng)查詢json中不存在的key時(shí),返回NULL

    5. 當(dāng)json tag作為子查詢結(jié)果時(shí),不再支持上層查詢繼續(xù)對(duì)子查詢中的json串做解析查詢。

      比如暫不支持

      select jtag->'key' from (select jtag from stable)

      不支持

      select jtag->'key' from (select jtag from stable) where jtag->'key'>0

      轉(zhuǎn)義字符說明

  • 轉(zhuǎn)義字符表 (轉(zhuǎn)義符的功能從 2.4.0.4 版本開始)

    字符序列 代表的字符
    \' 單引號(hào)'
    \" 雙引號(hào)"
    \n 換行符
    \r 回車符
    \t tab符
    \\ 斜杠\
    \% % 規(guī)則見下
    \_ _ 規(guī)則見下
  • 轉(zhuǎn)義字符使用規(guī)則

    1. 標(biāo)識(shí)符里有轉(zhuǎn)義字符(數(shù)據(jù)庫(kù)名、表名、列名)
    2. 普通標(biāo)識(shí)符: 直接提示錯(cuò)誤的標(biāo)識(shí)符,因?yàn)闃?biāo)識(shí)符規(guī)定必須是數(shù)字、字母和下劃線,并且不能以數(shù)字開頭。
    3. 反引號(hào)``標(biāo)識(shí)符: 保持原樣,不轉(zhuǎn)義
    4. 數(shù)據(jù)里有轉(zhuǎn)義字符
    5. 遇到上面定義的轉(zhuǎn)義字符會(huì)轉(zhuǎn)義(%和_見下面說明),如果沒有匹配的轉(zhuǎn)義字符會(huì)忽略掉轉(zhuǎn)義符\。
    6. 對(duì)于%和,因?yàn)樵趌ike里這兩個(gè)字符是通配符,所以在模式匹配like里用\%%和\_表示字符里本身的%和,如果在like模式匹配上下文之外使用\%\_,則它們的計(jì)算結(jié)果為字符串\%\_,而不是%和_。