diff --git a/documentation20/cn/12.taos-sql/docs.md b/documentation20/cn/12.taos-sql/docs.md index 8308f4c40770aea49eeef631efef9a6c7a486803..c0d203b50fda36359f6be8f22e2ca583df4167e8 100755 --- a/documentation20/cn/12.taos-sql/docs.md +++ b/documentation20/cn/12.taos-sql/docs.md @@ -733,6 +733,8 @@ summary: > TBNAME: 在超级表查询中可视为一个特殊的标签,代表查询涉及的子表名
\_c0: 表示表(超级表)的第一列 + \_qstart,\_qstop,\_qduration: 表示查询过滤窗口的起始,结束以及持续时间(从 2.6.0.0 版本开始支持) + \_wstart,\_wstop,\_wduration: 窗口切分聚合查询(例如 interval/session window/state window)中表示每个切分窗口的起始,结束以及持续时间(从 2.6.0.0 版本开始支持) #### 小技巧 @@ -2276,7 +2278,318 @@ TDengine支持针对数据的聚合查询。提供支持的聚合和选择函数 2022-01-01 08:00:07.000000000 | 9 | 2 | Query OK, 6 row(s) in set (0.002613s) ``` +- **HISTOGRAM** + ```mysql + SELECT HISTOGRAM(field_name,bin_type, bin_description, normalized) FROM tb_name [WHERE clause]; + ``` + 功能说明:统计数据按照用户指定区间的分布。 + + 返回结果数据类型:如归一化参数 normalized 设置为 1,返回结果为双精度浮点类型 DOUBLE,否则为长整形 INT64。 + + 应用字段:数值型字段。 + + 适用于:**表、(超级表)**。 + + 说明: + 1)从 2.6.0.0 版本开始支持此函数。 + 2)bin_type 用户指定的分桶类型, 有效输入类型为"user_input“, ”linear_bin", "log_bin"。 + 3)bin_description 描述如何生成分桶区间,针对三种桶类型,分别为以下描述格式(均为 JSON 格式字符串): + - "user_input": "[1, 3, 5, 7]" + 用户指定 bin 的具体数值。 + + - "linear_bin": "{"start": 0.0, "width": 5.0, "count": 5, "infinity": true}" + "start" 表示数据起始点,"width" 表示每次 bin 偏移量, "count" 为 bin 的总数,"infinity" 表示是否添加(-inf, inf)作为区间起点跟终点, + 生成区间为[-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" 表示数据起始点,"factor" 表示按指数递增的因子,"count" 为 bin 的总数,"infinity" 表示是否添加(-inf, inf)作为区间起点跟终点, + 生成区间为[-inf, 1.0, 2.0, 4.0, 8.0, 16.0, +inf]。 + 4)normalized 是否将返回结果归一化到 0~1 之间 。有效输入为 0 和 1。 + + 示例: + ```mysql + 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} | + ``` + +### 时间函数 + +从 2.6.0.0 版本开始,TDengine查询引擎支持以下时间相关函数: + +- **NOW** + ```mysql + 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(), ...); + ``` + 功能说明:返回客户端当前系统时间。 + + 返回结果数据类型:TIMESTAMP 时间戳类型。 + + 应用字段:在 WHERE 或 INSERT 语句中使用时只能作用于TIMESTAMP类型的字段。 + + 适用于:**表、超级表**。 + + 说明: + 1)支持时间加减操作,如NOW() + 1s, 支持的时间单位如下: + b(纳秒)、u(微秒)、a(毫秒)、s(秒)、m(分)、h(小时)、d(天)、w(周)。 + 2)返回的时间戳精度与当前 DATABASE 设置的时间精度一致。 + + 示例: + ```mysql + 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** + ```mysql + 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(), ...); + ``` + 功能说明:返回客户端当日零时的系统时间。 + + 返回结果数据类型:TIMESTAMP 时间戳类型。 + + 应用字段:在 WHERE 或 INSERT 语句中使用时只能作用于 TIMESTAMP 类型的字段。 + + 适用于:**表、超级表**。 + + 说明: + 1)支持时间加减操作,如TODAY() + 1s, 支持的时间单位如下: + b(纳秒),u(微秒),a(毫秒),s(秒),m(分),h(小时),d(天),w(周)。 + 2)返回的时间戳精度与当前 DATABASE 设置的时间精度一致。 + + 示例: + ```mysql + 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** + ```mysql + SELECT TIMEZONE() FROM { tb_name | stb_name } [WHERE clause]; + ``` + 功能说明:返回客户端当前时区信息。 + + 返回结果数据类型:BINARY 类型。 + + 应用字段:无 + + 适用于:**表、超级表**。 + + 示例: + ```mysql + taos> SELECT TIMEZONE() FROM meters; + timezone() | + ================================= + UTC (UTC, +0000) | + Query OK, 1 row(s) in set (0.002093s) + ``` + +- **TO_ISO8601** + ```mysql + SELECT TO_ISO8601(ts_val | ts_col) FROM { tb_name | stb_name } [WHERE clause]; + ``` + 功能说明:将 UNIX 时间戳转换成为 ISO8601 标准的日期时间格式,并附加客户端时区信息。 + + 返回结果数据类型:BINARY 类型。 + + 应用字段:UNIX 时间戳常量或是 TIMESTAMP 类型的列 + + 适用于:**表、超级表**。 + + 说明:如果输入是 UNIX 时间戳常量,返回格式精度由时间戳的位数决定,如果输入是 TIMSTAMP 类型的列,返回格式的时间戳精度与当前 DATABASE 设置的时间精度一致。 + + 示例: + ```mysql + 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** + ```mysql + SELECT TO_UNIXTIMESTAMP(datetime_string | ts_col) FROM { tb_name | stb_name } [WHERE clause]; + ``` + 功能说明:将日期时间格式的字符串转换成为 UNIX 时间戳。 + + 返回结果数据类型:长整型INT64。 + + 应用字段:字符串常量或是 BINARY/NCHAR 类型的列。 + + 适用于:**表、超级表**。 + + 说明: + 1)输入的日期时间字符串须符合 ISO8601/RFC3339 标准,无法转换的字符串格式将返回0。 + 2)返回的时间戳精度与当前 DATABASE 设置的时间精度一致。 + + 示例: + ```mysql + 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** + ```mysql + SELECT TIMETRUNCATE(ts_val | datetime_string | ts_col, time_unit) FROM { tb_name | stb_name } [WHERE clause]; + ``` + 功能说明:将时间戳按照指定时间单位 time_unit 进行截断。 + 返回结果数据类型:TIMESTAMP 时间戳类型。 + + 应用字段:UNIX 时间戳,日期时间格式的字符串,或者 TIMESTAMP 类型的列。 + + 适用于:**表、超级表**。 + + 说明: + 1)支持的时间单位 time_unit 如下: + 1u(微秒),1a(毫秒),1s(秒),1m(分),1h(小时),1d(天)。 + 2)返回的时间戳精度与当前 DATABASE 设置的时间精度一致。 + + 示例: + ```mysql + 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** + ```mysql + 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 指定的精度。 + + 返回结果数据类型:长整型INT64。 + + 应用字段:UNIX 时间戳,日期时间格式的字符串,或者 TIMESTAMP 类型的列。 + + 适用于:**表、超级表**。 + + 说明: + 1)支持的时间单位 time_unit 如下: + 1u(微秒),1a(毫秒),1s(秒),1m(分),1h(小时),1d(天)。 + 2)如果时间单位 time_unit 未指定, 返回的时间差值精度与当前 DATABASE 设置的时间精度一致。 + + 示例: + ```mysql + 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 支持按时间段窗口切分方式进行聚合结果查询,比如温度传感器每秒采集一次数据,但需查询每隔 10 分钟的温度平均值。这种场景下可以使用窗口子句来获得需要的查询结果。