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

TAOS SQL

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

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

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

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

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

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

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 個智能電表的數(shù)據(jù),按照 TDengine 的建模規(guī)則,對應 4 個子表,其名稱分別是 d1001, d1002, d1003, d1004。

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

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

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

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

CREATE DATABASE db_name PRECISION 'ns';

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

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

Tips:

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

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

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

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

    說明:

    1) KEEP是該數(shù)據(jù)庫的數(shù)據(jù)保留多長天數(shù),缺省是3650天(10年),數(shù)據(jù)庫會自動刪除超過時限的數(shù)據(jù);

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

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

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

    4) 一條SQL 語句的最大長度為65480個字符;

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

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

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

    USE db_name;

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

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

    DROP DATABASE [IF EXISTS] db_name;

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

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

    ALTER DATABASE db_name COMP 2;

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

    ALTER DATABASE db_name REPLICA 2;

    REPLICA 參數(shù)是指修改數(shù)據(jù)庫副本數(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ù)寫入成功所需要的確認數(shù),取值范圍 [1, 2]。對于異步復制,quorum 設(shè)為 1,具有 master 角色的虛擬節(jié)點自己確認即可。對于同步復制,quorum 設(shè)為 2。原則上,Quorum >= 1 并且 Quorum <= replica(副本數(shù)),這個參數(shù)在啟動一個同步模塊實例時需要提供。

    ALTER DATABASE db_name BLOCKS 100;

    BLOCKS 參數(shù)是每個 VNODE (TSDB) 中有多少 cache 大小的內(nèi)存塊,因此一個 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 表示同時打開緩存最近行和列功能。(從 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來確認是否修改成功。另外,從 2.1.3.0 版本開始,修改這些參數(shù)后無需重啟服務(wù)器即可生效。

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

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

    SHOW CREATE DATABASE db_name;

    常用于數(shù)據(jù)庫遷移。對一個已經(jīng)存在的數(shù)據(jù)庫,返回其創(chuàng)建語句;在另一個集群中執(zhí)行該語句,就能得到一個設(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) 表的第一個字段必須是 TIMESTAMP,并且系統(tǒng)自動將其設(shè)為主鍵;

    2) 表名最大長度為 192;

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

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

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

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

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

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

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

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

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

    以指定的超級表為模板,指定一部分 TAGS 列的值來創(chuàng)建數(shù)據(jù)表(沒被指定的 TAGS 列會設(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ù)表必須以超級表為模板。

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

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

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

    SHOW TABLES [LIKE tb_name_wildcar];

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

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

    SHOW CREATE TABLE tb_name;

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

  • 在線修改顯示字符寬度

    SET MAX_BINARY_DISPLAY_WIDTH <nn>;

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

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

    DESCRIBE tb_name;
  • 表增加列

    ALTER TABLE tb_name ADD COLUMN field_name data_type;

    說明:

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

    2) 列名最大長度為64。

  • 表刪除列

    ALTER TABLE tb_name DROP COLUMN field_name; 

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

  • 表修改列寬

    ALTER TABLE tb_name MODIFY COLUMN field_name data_type(length); 

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

超級表STable管理

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

  • 創(chuàng)建超級表

    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ù)時需要提供給定值,而暫不支持四則運算,例如 NOW + 10s 這類表達式)

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

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

    4) TAGS 最多允許 128 個,至少 1 個,總長度不超過 16 KB。

  • 刪除超級表

    DROP STABLE [IF EXISTS] stb_name;

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

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

    SHOW STABLES [LIKE tb_name_wildcard];

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

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

    SHOW CREATE STABLE stb_name;

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

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

    DESCRIBE stb_name;
  • 超級表增加列

    ALTER STABLE stb_name ADD COLUMN field_name data_type;
  • 超級表刪除列

    ALTER STABLE stb_name DROP COLUMN field_name; 
  • 超級表修改列寬

    ALTER STABLE stb_name MODIFY COLUMN field_name data_type(length); 

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

超級表 STable 中 TAG 管理

  • 添加標簽

    ALTER STABLE stb_name ADD TAG new_tag_name tag_type;

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

  • 刪除標簽

    ALTER STABLE stb_name DROP TAG tag_name;

    刪除超級表的一個標簽,從超級表刪除某個標簽后,該超級表下的所有子表也會自動刪除該標簽。

  • 修改標簽名

    ALTER STABLE stb_name CHANGE TAG old_tag_name new_tag_name;

    修改超級表的標簽名,從超級表修改某個標簽名后,該超級表下的所有子表也會自動更新該標簽名。

  • 修改標簽列寬度

    ALTER STABLE stb_name MODIFY TAG tag_name data_type(length); 

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

  • 修改子表標簽值

    ALTER TABLE tb_name SET TAG tag_name=new_tag_value;

    說明:除了更新標簽的值的操作是針對子表進行,其他所有的標簽操作(添加標簽、刪除標簽等)均只能作用于 STable,不能對單個子表操作。對 STable 添加標簽以后,依托于該 STable 建立的所有表將自動增加了一個標簽,所有新增標簽的默認值都是 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
    ...];

詳細描述及示例:

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

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

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

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

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

    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ù)據(jù)時并不確定某個表是否存在,此時可以在寫入數(shù)據(jù)時使用自動建表語法來創(chuàng)建不存在的表,若該表已存在則不會建立新表。自動建表時,要求必須以超級表為模板,并寫明數(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);

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

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

    自動建表語法也支持在一條語句中向多個表插入記錄。例如:

    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 版本之前,在使用自動建表語法并指定列時,子表的列名必須緊跟在子表名稱后面,而不能如例子里那樣放在 TAGS 和 VALUES 之間。從 2.0.20.5 版本開始,兩種寫法都可以,但不能在一條 SQL 語句中混用,否則會報語法錯誤。

  • 插入來自文件的數(shù)據(jù)記錄
    除了使用 VALUES 關(guān)鍵字插入一行或多行數(shù)據(jù)外,也可以把要寫入的數(shù)據(jù)放在 CSV 文件中(英文逗號分隔、英文單引號括住每個值)供 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'

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

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

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

    也可以在一條語句中向多個表以自動建表的方式插入記錄。例如:

    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完全一樣。

說明:針對 insert 類型的 SQL 語句,我們采用的流式解析策略,在發(fā)現(xiàn)后面的錯誤之前,前面正確的部分 SQL 仍會執(zhí)行。下面的 SQL 中,INSERT 語句是無效的,但是 d1001 仍會被創(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];

通配符

通配符 * 可以用于代指全部列。對于普通表,結(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)

在針對超級表,通配符包含 標簽列 。

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)

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

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

在JOIN查詢中,帶前綴的*和不帶前綴*返回的結(jié)果有差別, *返回全部表的所有列數(shù)據(jù)(不包含標簽),帶前綴的通配符,則只返回該表的列數(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ù)來進行查詢的過程中,部分SQL函數(shù)支持通配符操作。其中的區(qū)別在于: count(*)函數(shù)只返回一列。first、last、last_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)

標簽列

從 2.0.14 版本開始,支持在普通表的查詢中指定 標簽列,且標簽列的值會與普通列的數(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)

注意:普通表的通配符 * 中并不包含 標簽列。

獲取標簽列或普通列的去重取值

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

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

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

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

說明:

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

結(jié)果集列名

SELECT子句中,如果不指定返回結(jié)果集合的列名,結(jié)果集列名稱默認使用SELECT子句中的表達式名稱作為列名稱。此外,用戶可使用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)

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

隱式結(jié)果列

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

表(超級表)列表

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

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

特殊功能

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

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

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

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

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

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

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 }

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

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

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

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

說明:

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

返回的結(jié)果是該表或超級表的數(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、查詢的(超級)表所包含的存儲在文件中的數(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 指標 392 行。
3、所有數(shù)據(jù)塊中,包含行數(shù)最多的數(shù)據(jù)塊所包含的行數(shù)量, 其中的 Max 指標 800 行。
4、所有數(shù)據(jù)塊行數(shù)的算數(shù)平均值 666行(其中的 Avg 項)。
5、所有數(shù)據(jù)塊中行數(shù)分布的均方差為 2.17 ( stddev )。
6、數(shù)據(jù)塊包含的行的總數(shù)為 2000 行(Rows)。
7、數(shù)據(jù)塊總數(shù)是 3 個數(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ù)塊信息的過程中讀取頭文件的時間開銷 1 微秒(SeekHeaderTime)。

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

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

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

小技巧

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

SELECT TBNAME, location FROM meters;

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

SELECT COUNT(TBNAME) FROM meters;

以上兩個查詢均只支持在WHERE條件子句中添加針對標簽(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)
  • 可以使用 * 返回所有列,或指定列名。可以對數(shù)字列進行四則運算,可以給輸出的列取列名。
    • 暫不支持含列名的四則運算表達式用于條件過濾算子(例如,不支持 where a*2>6;,但可以寫 where a>6/2;)。
    • 暫不支持含列名的四則運算表達式作為 SQL 函數(shù)的應用對象(例如,不支持 select min(2*a) from t;,但可以寫 select 2*min(a) from t;)。
  • WHERE 語句可以使用各種邏輯判斷來過濾數(shù)字值,或使用通配符來過濾字符串。
  • 輸出結(jié)果缺省按首列時間戳升序排序,但可以指定按降序排序( _c0 指首列時間戳)。使用 ORDER BY 對其他字段進行排序,排序結(jié)果順序不確定。
  • 參數(shù) LIMIT 控制輸出條數(shù),OFFSET 指定從第幾條開始輸出。LIMIT/OFFSET 對結(jié)果集的執(zhí)行順序在 ORDER BY 之后。且 LIMIT 5 OFFSET 2 可以簡寫為 LIMIT 2, 5。
    • 在有 GROUP BY 子句的情況下,LIMIT 參數(shù)控制的是每個分組中至多允許輸出的條數(shù)。
  • 參數(shù) SLIMIT 控制由 GROUP BY 指令劃分的分組中,至多允許輸出幾個分組的數(shù)據(jù)。且 SLIMIT 5 SOFFSET 2 可以簡寫為 SLIMIT 2, 5
  • 通過 “>>” 輸出結(jié)果可以導出到指定文件。

支持的條件過濾操作

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. <> 算子也可以寫為 != ,請注意,這個算子不能用于數(shù)據(jù)表第一列的 timestamp 字段。

  2. like 算子使用通配符字符串進行匹配檢查。

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

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

    • 從 2.3.0.0 版本開始,允許使用多個時間過濾條件,但首列時間戳的過濾運算結(jié)果只能包含一個區(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 類型會受到浮點數(shù)精度影響,集合內(nèi)的值在精度范圍內(nèi)認為和數(shù)據(jù)行的值完全相等才能匹配成功;TIMESTAMP 類型支持非主鍵的列。

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

    語法

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

    match/MATCH 匹配正則表達式

    nmatch/NMATCH 不匹配正則表達式

    正則表達式規(guī)范

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

    正則表達使用示例

    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)

    使用限制

    只能針對表名 (tbname) 以及binary類型的普通列或標簽進行正則表達式過濾。

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

JOIN 子句

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

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

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

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

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

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

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

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

嵌套查詢

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

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

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

說明:

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

UNION ALL 子句

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

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

SQL 示例

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

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

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

    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, 時間大于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支持針對數(shù)據(jù)的聚合查詢。提供支持的聚合和選擇函數(shù)如下:

  • COUNT

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

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

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

    應用字段:應用全部字段。

    適用于:表、超級表

    說明:

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

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

    3)如果統(tǒng)計對象是具體的列,則返回該列中非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)計表/超級表中某列的平均值。

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

    應用字段:不能應用在timestamp、binary、nchar、bool字段。

    適用于:表、超級表

    示例:

    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;

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

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

    適用于:表、(超級表)

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

  • IRATE

    SELECT IRATE(field_name) FROM tb_name WHERE clause;

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

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

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

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

  • SUM

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

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

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級表。

    示例:

    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)計表中某列的均方差。

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

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

    示例:

    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)計表中某列的值是主鍵(時間戳)的擬合直線方程。start_val是自變量初始值,step_val是自變量的步長值。

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

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

    適用于:。

    示例:

    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)頻率最高的值,若存在多個頻率相同的最高值,輸出空。不能匹配標簽、時間戳輸出。

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

    應用字段:適合于除時間主列外的任何類型字段。

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

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

    示例:

    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ù)是個估算值,標準誤差(標準誤差是多次實驗,每次的平均數(shù)的標準差,不是與真實結(jié)果的誤差)為0.81%。
    • 在數(shù)據(jù)量較少的時候該算法不是很準確,可以使用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ù)的時候,可以同時指定輸出 ts 列或標簽列(包括 tbname),這樣就可以方便地知道被選出的值是源于哪個數(shù)據(jù)行的。

  • MIN

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

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

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級表。

    示例:

    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)計表/超級表中某列的值最大值。

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級表。

    示例:

    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)計表/超級表中某列的值最先寫入的非NULL值。

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

    應用字段:所有字段。

    適用于:表、超級表

    說明:

    1)如果要返回各個列的首個(時間戳最?。┓荖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)計表/超級表中某列的值最后寫入的非 NULL 值。

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

    應用字段:所有字段。

    適用于:表、超級表

    說明:

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

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

    3)在用于超級表時,時間戳完全一樣且同為最大的數(shù)據(jù)行可能有多個,那么會從中隨機返回一條,而并不保證多次運行所挑選的數(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)計表/超級表中某列的值最大 k 個非 NULL 值。如果多條數(shù)據(jù)取值一樣,全部取用又會超出 k 條限制時,系統(tǒng)會從相同值中隨機選取符合要求的數(shù)量返回。

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級表。

    說明:

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

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

    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)計表/超級表中某列的值最小 k 個非 NULL 值。如果多條數(shù)據(jù)取值一樣,全部取用又會超出 k 條限制時,系統(tǒng)會從相同值中隨機選取符合要求的數(shù)量返回。

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級表。

    說明:

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

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

    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)計表中某列的值百分比分位數(shù)。

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

    適用于:。

    說明:P值取值范圍0≤P≤100,為0的時候等同于MIN,為100的時候等同于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)計表/超級表中指定列的值百分比分位數(shù),與PERCENTILE函數(shù)相似,但是返回近似結(jié)果。

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級表。

    說明:
    P值有效取值范圍0≤P≤100,為 0 的時候等同于 MIN,為 100 的時候等同于MAX;
    algo_type的有效輸入:defaultt-digest。 用于指定計算近似分位數(shù)的算法??刹惶峁┑谌齻€參數(shù)的輸入,此時將使用 default 的算法進行計算,即 apercentile(column_name, 50, "default") 與 apercentile(column_name, 50) 等價。當使用“t-digest”參數(shù)的時候,將使用t-digest方式采樣計算近似分位數(shù)。但該參數(shù)指定計算算法的功能從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 };

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

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

    應用字段:所有字段。

    適用于:表、超級表

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

    說明:在用于超級表時,時間戳完全一樣且同為最大的數(shù)據(jù)行可能有多個,那么會從中隨機返回一條,而并不保證多次運行所挑選的數(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})];

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

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

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

    適用于:表、超級表、嵌套查詢

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

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

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

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

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

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

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

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

    1) 單點線性插值

      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秒鐘進行取值(不插值)

      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秒鐘進行線性插值

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

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

       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ù)進行從2017-07-14 18:00:00到2017-07-14 19:00:00間每隔5秒鐘進行線性插值

       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})];

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

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

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

    適用于:表、超級表。

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

    示例:

    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ù)據(jù),在不指定插值生成策略的情況下,不會返回結(jié)果,如果指定了插值策略,會根據(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)

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

    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個,然后取連續(xù) k 個記錄,不忽略 NULL 值。offset_val 可以不輸入。此時返回最后的 k 個記錄。當有 offset_val 輸入的情況下,該函數(shù)功能等效于order by ts desc LIMIT k OFFSET offset_val。

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

    返回結(jié)果數(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 相似,但是可以匹配標簽和時間戳信息??梢葬槍Τ龝r間列以外的字段進行查詢,可以匹配標簽和時間戳,其中的標簽和時間戳是第一次出現(xiàn)時刻的標簽和時間戳。

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

    應用字段:適合于除時間類型以外的字段。

    適用于:表、超級表

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

    說明:

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

    示例:

    
    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)

計算函數(shù)

  • DIFF

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

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

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

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

    說明:輸出結(jié)果行數(shù)是范圍內(nèi)總行數(shù)減一,第一行沒有結(jié)果輸出。從 2.1.3.0 版本開始,DIFF 函數(shù)可以在由 GROUP BY 劃分出單獨時間線的情況下用于超級表(也即 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)計表中某列數(shù)值的單位變化率。其中單位時間區(qū)間的長度可以通過 time_interval 參數(shù)指定,最小可以是 1 秒(1s);ignore_negative 參數(shù)的值可以是 0 或 1,為 1 時表示忽略負值。

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

    應用字段:不能應用在 timestamp、binary、nchar、bool 類型字段。

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

    說明:(從 2.1.3.0 版本開始新增此函數(shù))輸出結(jié)果行數(shù)是范圍內(nèi)總行數(shù)減一,第一行沒有結(jié)果輸出。DERIVATIVE 函數(shù)可以在由 GROUP BY 劃分出單獨時間線的情況下用于超級表(也即 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)計表/超級表中某列的最大值和最小值之差。

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

    應用字段:不能應用在binary、nchar、bool類型字段。

    適用于:表、超級表。

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

    示例:

    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ù)類型:不能應用在 timestamp、binary、nchar、bool 類型字段上;在超級表查詢中使用時,不能應用在 tag 列,無論 tag 列的類型是什么類型。

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

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

  • 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ù)類型返回值為長整型 (int64_t),浮點數(shù)返回值為雙精度浮點數(shù)(Double)。無符號整數(shù)類型返回值為無符號長整型(uint64_t)。 返回結(jié)果中同時帶有每行記錄對應的時間戳。

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

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

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

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

  • MAVG

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

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

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

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

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

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

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

  • SAMPLE

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

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

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

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

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

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

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

  • ASIN

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

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

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

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

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

    使用說明:

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

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

    版本2.6.0.x后支持

  • ACOS

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

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

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

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

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

    使用說明:

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

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

    版本2.6.0.x后支持

  • ATAN

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

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

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

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

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

    使用說明:

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

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

    版本2.6.0.x后支持

  • SIN

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

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

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

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

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

    使用說明:

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

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

    版本2.6.0.x后支持

  • COS

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

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

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

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

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

    使用說明:

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

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

    版本2.6.0.x后支持

  • TAN

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

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

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

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

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

    使用說明:

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

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

    版本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ù)類型:不能應用在 timestamp、binary、nchar、bool 類型字段上;在超級表查詢中使用時,不能應用在 tag 列

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

    使用說明:

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

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

    版本2.6.0.x后支持

  • LOG

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

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

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

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

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

    使用說明:

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

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

    版本2.6.0.x后支持

  • ABS

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

    功能說明:獲得指定列的絕對值

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

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

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

    使用說明:

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

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

    版本2.6.0.x后支持

  • SQRT

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

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

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

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

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

    使用說明:

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

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

    版本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支持普通列、常量、標量函數(shù)及它們之間的四則運算,不支持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); 輸出目標類型只支持BIGINT/BINARY(N)/TIMESTAMP/NCHAR(N)/BIGINT UNSIGNED。

    說明:

    對于不能支持的類型轉(zhuǎn)換會直接報錯。

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

    對于類型支持但某些值無法正確轉(zhuǎn)換的情況對應的轉(zhuǎn)換后的值以轉(zhuǎn)換函數(shù)輸出為準。目前可能遇到的幾種情況: 1)BINARY/NCHAR轉(zhuǎn)BIGINT/BIGINT UNSIGNED時可能出現(xiàn)的無效字符情況,例如"a"可能轉(zhuǎn)為0。 2)有符號數(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格式的字符串或者列。不能應用在TAG列。

    說明:

    如果輸入值為NULL,輸出值為NULL。 該函數(shù)最小參數(shù)個數(shù)為2個,最大參數(shù)個數(shù)為8個。 該函數(shù)可以應用在普通表和超級表上。 該函數(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格式的字符串或者列。不能應用在TAG列。

    說明:

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

  • LENGTH

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

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

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

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

    說明:

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

  • CHAR_LENGTH

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

    功能說明:以字符計數(shù)的字符串長度。

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

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

    說明:

    如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應用在普通表和超級表上。 該函數(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類型的字符串或者列。不能應用在TAG列。

    說明:

    如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應用在普通表和超級表上。 該函數(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類型的字符串或者列。不能應用在TAG列。

    說明:

    如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應用在普通表和超級表上。 該函數(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類型的字符串或者列。不能應用在TAG列。

    說明:

    如果輸入值為NULL,輸出值為NULL。 該函數(shù)可以應用在普通表和超級表上。 該函數(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類型的字符串或者列。不能應用在TAG列。

    說明:

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

  • SUBSTR

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

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

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

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

    說明:

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

  • 四則運算

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

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

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

    應用字段:不能應用在timestamp、binary、nchar、bool類型字段。

    適用于:表、超級表。

    說明:

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

    2)NULL字段不參與計算,如果參與計算的某行中包含NULL,該行的計算結(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];

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

    參數(shù)范圍:

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

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

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

    嵌套子查詢支持:不支持應用在子查詢上。

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

    說明:

    • 該函數(shù)可以應用在普通表上,在由 GROUP BY 劃分出單獨時間線的情況下用于超級表(也即 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];

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

    參數(shù)范圍:

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

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

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

    嵌套子查詢支持:不支持應用在子查詢上。

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

    說明:

    • 該函數(shù)可以應用在普通表上,在由 GROUP BY 劃分出單獨時間線的情況下用于超級表(也即 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)計數(shù)據(jù)按照用戶指定區(qū)間的分布。

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

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

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

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

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

    • "linear_bin": "{"start": 0.0, "width": 5.0, "count": 5, "infinity": true}" "start" 表示數(shù)據(jù)起始點,"width" 表示每次 bin 偏移量, "count" 為 bin 的總數(shù),"infinity" 表示是否添加(-inf, inf)作為區(qū)間起點跟終點, 生成區(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ù)起始點,"factor" 表示按指數(shù)遞增的因子,"count" 為 bin 的總數(shù),"infinity" 表示是否添加(-inf, inf)作為區(qū)間起點跟終點, 生成區(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ù)

從 2.6.0.0 版本開始,TDengine查詢引擎支持以下時間相關(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(), ...);

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

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

    應用字段:在 WHERE 或 INSERT 語句中使用時只能作用于TIMESTAMP類型的字段。

    適用于:表、超級表。

    說明: 1)支持時間加減操作,如NOW() + 1s, 支持的時間單位如下: b(納秒)、u(微秒)、a(毫秒)、s(秒)、m(分)、h(小時)、d(天)、w(周)。 2)返回的時間戳精度與當前 DATABASE 設(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(), ...);

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

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

    應用字段:在 WHERE 或 INSERT 語句中使用時只能作用于 TIMESTAMP 類型的字段。

    適用于:表、超級表

    說明: 1)支持時間加減操作,如TODAY() + 1s, 支持的時間單位如下: b(納秒),u(微秒),a(毫秒),s(秒),m(分),h(小時),d(天),w(周)。 2)返回的時間戳精度與當前 DATABASE 設(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];

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

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

    應用字段:無

    適用于:表、超級表。

    示例:

    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 時間戳轉(zhuǎn)換成為 ISO8601 標準的日期時間格式,并附加客戶端時區(qū)信息。

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

    應用字段:UNIX 時間戳常量或是 TIMESTAMP 類型的列

    適用于:表、超級表

    說明:如果輸入是 UNIX 時間戳常量,返回格式精度由時間戳的位數(shù)決定,如果輸入是 TIMSTAMP 類型的列,返回格式的時間戳精度與當前 DATABASE 設(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];

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

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

    應用字段:字符串常量或是 BINARY/NCHAR 類型的列。

    適用于:表、超級表。

    說明: 1)輸入的日期時間字符串須符合 ISO8601/RFC3339 標準,無法轉(zhuǎn)換的字符串格式將返回0。 2)返回的時間戳精度與當前 DATABASE 設(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];

      功能說明:將時間戳按照指定時間單位 time_unit 進行截斷。

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

    應用字段:UNIX 時間戳,日期時間格式的字符串,或者 TIMESTAMP 類型的列。

    適用于:表、超級表。

    說明: 1)支持的時間單位 time_unit 如下: 1u(微秒),1a(毫秒),1s(秒),1m(分),1h(小時),1d(天)。 2)返回的時間戳精度與當前 DATABASE 設(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];

      功能說明:計算兩個時間戳之間的差值,并近似到時間單位 time_unit 指定的精度。

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

    應用字段:UNIX 時間戳,日期時間格式的字符串,或者 TIMESTAMP 類型的列。

    適用于:表、超級表。

    說明: 1)支持的時間單位 time_unit 如下: 1u(微秒),1a(毫秒),1s(秒),1m(分),1h(小時),1d(天)。 2)如果時間單位 time_unit 未指定, 返回的時間差值精度與當前 DATABASE 設(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 支持按時間段窗口切分方式進行聚合結(jié)果查詢,比如溫度傳感器每秒采集一次數(shù)據(jù),但需查詢每隔 10 分鐘的溫度平均值。這種場景下可以使用窗口子句來獲得需要的查詢結(jié)果。 窗口子句用于針對查詢的數(shù)據(jù)集合進行按照窗口切分成為查詢子集并進行聚合,窗口包含時間窗口(time window)、狀態(tài)窗口(status window)、會話窗口(session window)三種窗口。其中時間窗口又可劃分為滑動時間窗口和翻轉(zhuǎn)時間窗口。

時間窗口

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

時間窗口示意圖

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

SELECT * FROM temp_table INTERVAL(1S)

SLIDING的向前滑動的時間不能超過一個窗口的時間范圍。以下語句非法:

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

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

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

狀態(tài)窗口

使用整數(shù)(布爾值)或字符串來標識產(chǎn)生記錄時候設(shè)備的狀態(tài)量。產(chǎn)生的記錄如果具有相同的狀態(tài)量數(shù)值則歸屬于同一個狀態(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]兩個。(狀態(tài)窗口暫不支持對超級表使用)

時間窗口示意圖

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

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

會話窗口

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

時間窗口示意圖

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


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ù),并要求每個函數(shù)僅輸出單個結(jié)果(例如:COUNT、AVG、SUM、STDDEV、LEASTSQUARES、PERCENTILE、MIN、MAX、FIRST、LAST),而不能使用具有多行輸出結(jié)果的函數(shù)(例如:DIFF 以及四則運算)。

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

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

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

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

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

說明:

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

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

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

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

針對智能電表采集的數(shù)據(jù),以 10 分鐘為一個階段,計算過去 24 小時的電流數(shù)據(jù)的平均值、最大值、電流的中位數(shù)。如果沒有計算值,用前一個非 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ù)庫名最大長度為 32。
  • 表名最大長度為 192。每行數(shù)據(jù)最大長度 48K 個字符(2.1.7.0 之前的版本為 16K,每個 BINARY/NCHAR 類型的列還會額外占用 2 個 byte 的存儲位置)
  • 列名最大長度為 64,最多允許 1024 列,最少需要 2 列,第一列必須是時間戳。(從 2.1.7.0 版本開始,改為最多允許 4096 列)
  • 標簽名最大長度為 64,最多允許 128 個,可以 1 個,一個表中標簽值的總長度不超過 16K 個字符。
  • SQL 語句最大長度 1048576 個字符,也可通過客戶端配置參數(shù) maxSQLLength 修改,取值范圍 65480 ~ 1048576。
  • SELECT 語句的查詢結(jié)果,最多允許返回 1024 列(語句中的函數(shù)調(diào)用可能也會占用一些列空間),超限時需要顯式指定較少的返回數(shù)據(jù)列,以避免語句執(zhí)行報錯。(從 2.1.7.0 版本開始,改為最多允許 4096 列)
  • 庫的數(shù)目,超級表的數(shù)目、表的數(shù)目,系統(tǒng)不做限制,僅受系統(tǒng)資源限制。

TAOS SQL 其他約定

GROUP BY的限制

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

IS NOT NULL 與不為空的表達式適用范圍

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

ORDER BY的限制

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

表(列)名合法性說明

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

轉(zhuǎn)義后表(列)名規(guī)則: 為了兼容支持更多形式的表(列)名,TDengine 引入新的轉(zhuǎn)義符 "`"??捎米尡砻c關(guān)鍵詞不沖突,同時不受限于上述表名稱合法性約束檢查,轉(zhuǎn)義符不計入表名稱的長度。 轉(zhuǎn)義后的表(列)名同樣受到長度限制要求,且長度計算的時候不計算轉(zhuǎn)義符。使用轉(zhuǎn)義字符以后,不再對轉(zhuǎn)義字符中的內(nèi)容進行大小寫統(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ù)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. 標簽操作

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

      支持修改json標簽名

      不支持添加json標簽、刪除json標簽、修改json標簽列寬

  • 其他約束條件

    1. 只有標簽列可以使用json類型,如果用json標簽,標簽列只能有一個。

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

    3. json格式限制:

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

    5. 當json tag作為子查詢結(jié)果時,不再支持上層查詢繼續(xù)對子查詢中的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 版本開始)

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

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