From e8fffba77a0b458a1d5e2cd1c2c34deb7a8fe159 Mon Sep 17 00:00:00 2001 From: leto-bbq Date: Tue, 3 Nov 2026 13:26:40 +0800 Subject: [PATCH] docs: add V2.0.12 featured functions for table model --- .../public/img/featured-function-01-en.png | Bin 0 -> 46822 bytes .../public/img/featured-function-01.png | Bin 0 -> 58889 bytes .../public/img/featured-function-02-en.png | Bin 0 -> 50704 bytes .../public/img/featured-function-02.png | Bin 0 -> 67016 bytes .../public/img/featured-function-03-en.png | Bin 0 -> 49100 bytes .../public/img/featured-function-03.png | Bin 0 -> 62251 bytes .../public/img/featured-function-04-en.png | Bin 0 -> 50719 bytes .../public/img/featured-function-04.png | Bin 0 -> 68560 bytes .../SQL-Manual/Featured-Functions_apache.md | 1085 +++++++++++++++- .../SQL-Manual/Featured-Functions_apache.md | 1084 +++++++++++++++- .../SQL-Manual/Featured-Functions_apache.md | 1117 ++++++++++++++++- .../SQL-Manual/Featured-Functions_apache.md | 1117 ++++++++++++++++- 12 files changed, 4367 insertions(+), 36 deletions(-) create mode 100644 src/.vuepress/public/img/featured-function-01-en.png create mode 100644 src/.vuepress/public/img/featured-function-01.png create mode 100644 src/.vuepress/public/img/featured-function-02-en.png create mode 100644 src/.vuepress/public/img/featured-function-02.png create mode 100644 src/.vuepress/public/img/featured-function-03-en.png create mode 100644 src/.vuepress/public/img/featured-function-03.png create mode 100644 src/.vuepress/public/img/featured-function-04-en.png create mode 100644 src/.vuepress/public/img/featured-function-04.png diff --git a/src/.vuepress/public/img/featured-function-01-en.png b/src/.vuepress/public/img/featured-function-01-en.png new file mode 100644 index 0000000000000000000000000000000000000000..ccb63b6795abb01be35874dc5fc58ec66f8ffe9c GIT binary patch literal 46822 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 literal 0 HcmV?d00001 diff --git a/src/.vuepress/public/img/featured-function-01.png b/src/.vuepress/public/img/featured-function-01.png new file mode 100644 index 0000000000000000000000000000000000000000..62720d0e23bec2a8fdab2de0192a5ff73dba0a9d GIT binary patch literal 58889 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 $7z0S-nknw49E5+K_PrIsY_(S6`^>hY(ss57xtT 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 literal 0 HcmV?d00001 diff --git a/src/.vuepress/public/img/featured-function-03-en.png b/src/.vuepress/public/img/featured-function-03-en.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f0071bf671e05fed247b8da33eb65715f4910a GIT binary patch literal 49100 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 literal 0 HcmV?d00001 diff --git a/src/.vuepress/public/img/featured-function-03.png b/src/.vuepress/public/img/featured-function-03.png new file mode 100644 index 0000000000000000000000000000000000000000..a0aaacb83bc7529d444c3907c06ac9b74b5d5752 GIT binary patch literal 62251 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 a8w|>_zvTN5YH=LAgR-@Dv?|);9`zq0lQqu( literal 0 HcmV?d00001 diff --git a/src/.vuepress/public/img/featured-function-04-en.png b/src/.vuepress/public/img/featured-function-04-en.png new file mode 100644 index 0000000000000000000000000000000000000000..e8bf682726bf025353335916816b3210c8b863c6 GIT binary patch literal 50719 zcma&O1z6Nu*FH=PFobkUHwuD^q|yyiBHbdQAPv$zNT&*-NC*l@N=UZ?N{V!MmoyB_ z{P%!*JkRsI-}RmAIyek4`?uF#d+l}K>s~udLrviV-bFk#G_(s!in4dm&@f8S(9r9l z7~q}Hg>4_eKj_YP6r|A#y6Bd{HxMf+RVg&Ik1_Zs=2+l+Tn9ycXEZdzX4L=at@hdX z(a^q>D#=RSbvIdiiC_xK(em4Q?o#yG}U@PqNzwNr$-oZqU*FP|jBI^1f>g-e0?1f!d?%LYg za*;Q24%$6VqUjqLAe=e-5Q~J75d&|h^_GOB#vHAzsgfqLbn%|v-uM?U`g?l=bzLm* z1HMdSe5Sz&u@LJsr@_aFm?db0Y>n=L-`@IKMr-&08+>vQ_62Jjn`Z7~NiOmaIXTya ztM2{Jzv~lu{_9D-!_vCaZ}Eqc;sw8Y^@?Eox*?Q@kcz2`SeR}#ov>YxSdY#M%5nZX zEbYaEt1m2R3YS_aF(R6=Lir(tt)AJ<*C`>Ctu%qS+0I3`$M# zWG^!#BO^OIJ0k;=TVdCDY6vSR;Qmd|y@8%D7y(}#pPFH;(0$_%;!4-ZPET)~GK#(e zp$x%~MUdXtw|n&H(v>S$1~l&8y{n-CzQS}}WGFu5=Eg8e_|AL|;~2eTY#b$#%g24; z!i8xEYDRfM*w1`NJFI`6RybMwdryysk&%(EuG{hMa#xqyN$$N#D0a}{?C^#4^yhrc zZ{ED&R8N6@MW2wOi=Nk5)JUO`O<%D51T4cVc`TQmo6F71YiDiUw8{c&Hm{$w-x7$s z?2rt(O?Z4zv?UTSpYPc9*NAU5y61QZ!O27U?unBkGg-CH5*S zB#8AUuv@(coO%3XDDe{N{pw4>f^c6CT3A?U=c_+?|Jshl5*vBgDv{!Q{OAyFmFgq- zcr_xgQJI78jt+kirH7wMM>Mm$&Yqzu#MDmG2zoq-Iw+hbn zz0*m4E+ZQ?OF;LGrl>~XHuMyZuyjmje(5h7Vh~4DbF}b!vktyNYhNSvjlg&NS!yKx zO-e+{t5>4;+la?B$WyyR#tp09y_1VZtL7ocYm{(RnaV2p1UX$kfP?i7YGk?`pe9Tw zFRiIb!Xt~}&7_ABEXgEkO+bF)E0N<7Ac=-Ivd|cBb~O}|=Rxd#B<$4J8PtGtg_l=e zsx%50f?-l9L<~(M%{wqNO*c^Vl`r1!jPz|dYEs-O^?A3hK3f;aK2nDlEM2**G!h~& zaYXZ#E0m|b(M)5UXk|glOd>l3GC*BFX{x6OEmZX{#DcWohBT*ZK(DZB;1}IroqmcV zzy2hQ;c%y6Y21(~=#4|^`*BT)M27Bsq;mE{moFuZ%t1Ww z*-zQGfUJtuPZo~qwwbSSuXpq&QkB1ZH&17Ut)!$h37FSE9kIOUIlVV8ARv&PSyra4`TW~A<-5HT69rt# zAY7b~ZOG%8%E5Tr#Z!rJaR}*REh}ql>2Y7Ycrmr6XTwdtzd31YY@E-ftffWfq_L9* zqKd4wiJTl3d1>d4XRUZ@_vQgBx=qU9Du_J6Uzt#=(%0A5R_wjh!%Qwa>J=3gWl~sP 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 Kf^yvU#(w}E*)=Bs literal 0 HcmV?d00001 diff --git a/src/.vuepress/public/img/featured-function-04.png b/src/.vuepress/public/img/featured-function-04.png new file mode 100644 index 0000000000000000000000000000000000000000..97dd57d142fc2704d6fb19a4311a8b255a57db92 GIT binary patch literal 68560 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

jK!uT%_DHqXCl8}2uV2mK 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 literal 0 HcmV?d00001 diff --git a/src/UserGuide/Master/Table/SQL-Manual/Featured-Functions_apache.md b/src/UserGuide/Master/Table/SQL-Manual/Featured-Functions_apache.md index d0b771fee..500cbfba4 100644 --- a/src/UserGuide/Master/Table/SQL-Manual/Featured-Functions_apache.md +++ b/src/UserGuide/Master/Table/SQL-Manual/Featured-Functions_apache.md @@ -210,6 +210,202 @@ GROUP BY 1, device_id; +---------+---------+--------+ ``` +### 1.3 `M4` Function + +#### 1.3.1 Description + +`M4` is a built-in polymorphic table function in the table model for downsampling time-series data. For each window, it extracts the first, last, minimum (bottom), and maximum (top) points to reduce the number of returned points while preserving the shape of the trend. `M4` takes a table argument and returns a result table, so it must be called in the `FROM` clause. + +- First point: the point with the earliest timestamp and a non-`NULL` value in the window. +- Last point: the point with the latest timestamp and a non-`NULL` value in the window. +- Minimum and maximum points: the points with the smallest and largest values in the window. If multiple points have the same value, the first point encountered in the input scan order is retained. +- Both time windows and point-count windows are supported. A duration literal for `SIZE`, such as `1h` or `10m`, selects time-window mode; a positive integer, such as `100`, selects point-count-window mode. + +> Supported since V2.0.12 + +#### 1.3.2 Function Definition + +```sql +SELECT * +FROM M4( + DATA => input_table PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column', + [ORIGIN => origin_timestamp,] + SIZE => window_duration | window_point_count, + [SLIDE => window_duration | window_point_count] +); +``` + +`DATA` is a set-semantic table argument. `ORDER BY` is required and must contain only the time column specified by `TIMECOL`, in ascending order. `PARTITION BY` is optional; if omitted, the entire input table is treated as one partition. Arguments can be passed by name or in declaration order. Named arguments are recommended. + +#### 1.3.3 Parameters + +|Parameter|Type|Required|Description| +|---|---|---|---| +|`DATA`|Table argument (`SET SEMANTIC`)|Yes|Input table or subquery. Supports `PARTITION BY` and `ORDER BY`.| +|`TIMECOL`|String|Yes|Name of the time column. The column must be of type `TIMESTAMP`, and `ORDER BY` must contain only this column.| +|`ORIGIN`|Timestamp|No|Alignment origin for time windows. Defaults to `0`. Not used in point-count-window mode.| +|`SIZE`|Duration or `INT64`|Yes|Duration of a time window or number of points in a point-count window. Must be positive.| +|`SLIDE`|Same type as `SIZE`|No|Window sliding step. Defaults to `SIZE` and must use the same window mode as `SIZE`.| + +**Calculation Rules** + +- The column specified by `TIMECOL` is excluded from M4 calculations. +- Columns specified by `PARTITION BY` are excluded from calculations but retained in the output. +- All remaining columns of comparable types participate in M4 calculations. +- After excluding the time and partition columns, analysis fails if no comparable column remains or if any remaining column has a non-comparable type. +- Records with a `NULL` value in a participating column are excluded from that column's `first`, `last`, `bottom`, and `top` calculations. +- For each participating column, the `first`, `last`, `bottom`, and `top` points are calculated, deduplicated, and output in ascending timestamp order. + +**Returned Results** + +- Time-window mode always generates `window_start` and `window_end`, both of type `TIMESTAMP`, to represent the interval `[window_start, window_end)`. +- Point-count-window mode always generates `window_index`, of type `INT64`. Window indices are calculated independently within each `PARTITION BY` partition, starting at `0`. +- Partition columns retain their original names and types and appear in declaration order. `OBJECT` columns cannot be partition columns. `BLOB` partition columns can be retained in the output but do not participate in M4 calculations. +- For each participating column `c`, two output columns are generated: `c_time` for the point's timestamp and `c` for its value. Their types match the corresponding input types. Results for multiple columns are expanded in input-column order. + +The number of output rows in a window equals the largest number of feature points among all participating columns. For columns with fewer feature points, the remaining `c_time` and `c` cells are filled with `NULL`. + +#### 1.3.4 Usage Examples + +The following examples use `table1` from [Sample Data](../Reference/Sample-Data.md). Because `table1` contains additional columns besides the time and partition columns, a subquery selects only `time`, `device_id`, `temperature`, and `humidity` for M4 calculations. + +**Example 1: Time Windows** + +For `device_id = '101'`, divide the data into 3-minute windows. `SIZE => 3m` selects time-window mode with a duration of 3 minutes. Each half-open interval `[window_start, window_end)` extracts the first, last, minimum, and maximum points for `temperature` and `humidity`, then outputs the points in ascending timestamp order. + +```sql +SELECT window_start, + window_end, + device_id, + temperature_time, + temperature, + humidity_time, + humidity +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + AND time >= 2024-11-27 16:38:00 + AND time <= 2024-11-27 16:44:00 + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + SIZE => 3m +); +``` + +Result: + +```text ++-----------------------------+-----------------------------+---------+-----------------------------+-----------+-----------------------------+--------+ +| window_start| window_end|device_id| temperature_time|temperature| humidity_time|humidity| ++-----------------------------+-----------------------------+---------+-----------------------------+-----------+-----------------------------+--------+ +|2024-11-27T16:36:00.000+08:00|2024-11-27T16:39:00.000+08:00| 101| null| null|2024-11-27T16:38:00.000+08:00| 35.1| +|2024-11-27T16:39:00.000+08:00|2024-11-27T16:42:00.000+08:00| 101|2024-11-27T16:39:00.000+08:00| 85.0|2024-11-27T16:39:00.000+08:00| 35.3| +|2024-11-27T16:39:00.000+08:00|2024-11-27T16:42:00.000+08:00| 101|2024-11-27T16:41:00.000+08:00| 85.0| null| null| +|2024-11-27T16:42:00.000+08:00|2024-11-27T16:45:00.000+08:00| 101| null| null|2024-11-27T16:42:00.000+08:00| 35.2| ++-----------------------------+-----------------------------+---------+-----------------------------+-----------+-----------------------------+--------+ +``` + +**Example 2: Point-Count Windows** + +For `device_id = '101'`, divide the data into windows of 3 points. `SIZE => 3` selects point-count-window mode, with 3 input rows per window. `window_index` identifies each window and starts at `0` within each partition. + +```sql +SELECT window_index, + device_id, + temperature_time, + temperature, + humidity_time, + humidity +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + AND time >= 2024-11-27 16:38:00 + AND time <= 2024-11-27 16:44:00 + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + SIZE => 3 +); +``` + +Result: + +```text ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +|window_index|device_id| temperature_time|temperature| humidity_time|humidity| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +| 0| 101|2024-11-27T16:39:00.000+08:00| 85.0|2024-11-27T16:38:00.000+08:00| 35.1| +| 0| 101|2024-11-27T16:40:00.000+08:00| 85.0|2024-11-27T16:39:00.000+08:00| 35.3| +| 1| 101|2024-11-27T16:41:00.000+08:00| 85.0|2024-11-27T16:42:00.000+08:00| 35.2| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +``` + +To specify the sliding step, also set `SLIDE`: + +```sql +SELECT window_index, + device_id, + temperature_time, + temperature, + humidity_time, + humidity +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + AND time >= 2024-11-27 16:38:00 + AND time <= 2024-11-27 16:44:00 + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + SIZE => 3, + SLIDE => 2 +); +``` + +This call uses a window size of 3 points and advances the window by 2 points each time. + +Result: + +```text ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +|window_index|device_id| temperature_time|temperature| humidity_time|humidity| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +| 0| 101|2024-11-27T16:39:00.000+08:00| 85.0|2024-11-27T16:38:00.000+08:00| 35.1| +| 0| 101|2024-11-27T16:40:00.000+08:00| 85.0|2024-11-27T16:39:00.000+08:00| 35.3| +| 1| 101|2024-11-27T16:40:00.000+08:00| 85.0|2024-11-27T16:42:00.000+08:00| 35.2| +| 1| 101|2024-11-27T16:41:00.000+08:00| 85.0| null| null| +| 2| 101| null| null|2024-11-27T16:42:00.000+08:00| 35.2| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +``` + +**Example 3: Invalid Sort Column** + +`M4` requires `ORDER BY` on the `DATA` argument, and the sort column must match the time column specified by `TIMECOL`. The following example incorrectly sorts by `temperature`: + +```sql +SELECT * +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + ) PARTITION BY device_id ORDER BY temperature, + TIMECOL => 'time', + SIZE => 3m +); +``` + +Error: + +```text +Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: The ORDER BY clause of the DATA argument must contain exactly the time column specified by the TIMECOL argument. +``` + ## 2. `DIFF` Function ### 2.1 **Description:** @@ -521,27 +717,47 @@ IoTDB> SELECT first(time) as window_start, last(time) as window_end, stock_id, a #### Function Description -The CAPACITY function groups data into fixed-size windows, where each window contains up to SIZE rows. +`CAPACITY` divides data into windows by point count (row count), with at most `SIZE` rows per window. Since V2.0.12, the optional `SLIDE` argument specifies the number of rows between the start positions of adjacent windows. #### Function Definition ```sql -CAPACITY(data [PARTITION BY(pkeys, ...)] [ORDER BY(okeys, ...)], size) +CAPACITY( + DATA => + [PARTITION BY [, ...]] + [ORDER BY [, ...]], + SIZE => + [, SLIDE => ] +) ``` #### Parameter Description -| Parameter | Type | Attributes | Description | -| ----------- | -------- | ---------------------------- | -------------------------------------- | -| DATA | Table | SET SEMANTIC, PASS THROUGH | Input table with partition/sort keys | -| SIZE | Scalar | Long integer | Window size (row count) | +|Parameter|Type|Required|Description| +|---|---|---|---| +|`DATA`|Table|Yes|Input table or subquery. Supports `PARTITION BY` and `ORDER BY` and passes through input columns.| +|`SIZE`|`INT64` scalar|Yes|Window capacity. Must be positive and specifies the maximum number of rows in a window.| +|`SLIDE`|`INT64` scalar|No|Window sliding step. Must be positive when specified. Defaults to `SIZE` when omitted.| + +- With `PARTITION BY`, row numbers and window indices are calculated independently within each partition, starting at `0`. +- With `ORDER BY`, row numbers follow the specified sort order. +- Window indices start at `0`. Window `k` covers the row-number interval `[k * SLIDE, k * SLIDE + SIZE)`. +- Window behavior depends on the relationship between `SLIDE` and `SIZE`: + +|Relationship|Window Type|Behavior| +|---|---|---| +|`SLIDE < SIZE`|Overlapping windows|Adjacent windows overlap. An input row can belong to multiple windows and appear multiple times with different `window_index` values.| +|`SLIDE = SIZE`|Non-overlapping windows|Adjacent windows are contiguous. This matches the behavior of `CAPACITY(DATA => ..., SIZE => n)` in earlier versions.| +|`SLIDE > SIZE`|Gapped windows|Gaps exist between adjacent windows. Input rows that fall into a gap are omitted from the output.| #### Returned Results -The CAPACITY function returns: +`CAPACITY` returns the following columns: -* `window_index`: Window identifier -* Pass-through columns: All input columns from DATA +- `window_index`: window index of type `INT64`, starting at `0`. +- Columns passed through from `DATA`, with their original names and types. + +You can query the result directly or aggregate it by `window_index` and business grouping columns. #### Usage Example @@ -558,7 +774,7 @@ IoTDB> SELECT * FROM CAPACITY(DATA => bid PARTITION BY stock_id ORDER BY time, S | 1|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +------------+-----------------------------+--------+-----+ --- Equivalent to tree model's GROUP BY COUNT when combined with GROUP BY +-- Combine with GROUP BY, equivalent to GROUP BY COUNT in the tree model IoTDB> SELECT first(time) as start_time, last(time) as end_time, stock_id, avg(price) as avg FROM CAPACITY(DATA => bid PARTITION BY stock_id ORDER BY time, SIZE => 2) GROUP BY window_index, stock_id; +-----------------------------+-----------------------------+--------+-----+ | start_time| end_time|stock_id| avg| @@ -568,6 +784,23 @@ IoTDB> SELECT first(time) as start_time, last(time) as end_time, stock_id, avg(p |2021-01-01T09:05:00.000+08:00|2021-01-01T09:07:00.000+08:00| AAPL|101.5| |2021-01-01T09:09:00.000+08:00|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +-----------------------------+-----------------------------+--------+-----+ + +-- Use SLIDE to generate overlapping windows (SLIDE < SIZE) +IoTDB> SELECT * FROM CAPACITY(DATA => bid PARTITION BY stock_id ORDER BY time, SIZE => 2, SLIDE => 1); ++------------+-----------------------------+--------+-----+ +|window_index| time|stock_id|price| ++------------+-----------------------------+--------+-----+ +| 0|2021-01-01T09:05:00.000+08:00| AAPL|100.0| +| 0|2021-01-01T09:07:00.000+08:00| AAPL|103.0| +| 1|2021-01-01T09:07:00.000+08:00| AAPL|103.0| +| 1|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +| 2|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +| 0|2021-01-01T09:06:00.000+08:00| TESL|200.0| +| 0|2021-01-01T09:07:00.000+08:00| TESL|202.0| +| 1|2021-01-01T09:07:00.000+08:00| TESL|202.0| +| 1|2021-01-01T09:15:00.000+08:00| TESL|195.0| +| 2|2021-01-01T09:15:00.000+08:00| TESL|195.0| ++------------+-----------------------------+--------+-----+ ``` ### 3.5 TUMBLE @@ -693,3 +926,835 @@ IoTDB> SELECT window_start, window_end, stock_id, avg(price) as avg FROM CUMULAT |2021-01-01T09:00:00.000+08:00|2021-01-01T09:10:00.000+08:00| AAPL|101.66666666666667| +-----------------------------+-----------------------------+--------+------------------+ ``` + + +## 4. `read_tsfile` Table Function + +### 4.1 Description + +`read_tsfile` reads table-model data from external TsFile files or directories and returns a temporary table source. You can use `SELECT`, `WHERE`, `ORDER BY`, `LIMIT`, `OFFSET`, and aggregation as you would with an ordinary table for read-only analysis and temporary processing. Results are not written back to the external TsFiles, and internal IoTDB data is not modified. This function does not support writing, deleting, modifying, or registering external TsFiles. + +> Supported since V2.0.12 + +### 4.2 Function Definition + +```sql +SELECT * +FROM TABLE( + read_tsfile( + TABLE_NAME => '', + PATHS => '' + ) +); +``` + +### 4.3 Parameters + +|Parameter|Required|Description| +|---|---|---| +|`PATHS`|Yes|Path to a TsFile or directory. Pass a single path as a string. For multiple paths, separate them with commas within the same string, for example `'/data/a.tsfile,/data/b.tsfile,/data/history'`.
- For a file path, the system attempts to open the file directly.
- For a directory, the system recursively scans files with the `.tsfile` suffix and identifies valid TsFiles by the magic numbers at the beginning and end of each file. Files that are unrecognized, incomplete, not in TsFile format, or not TsFile V4 are excluded from the query.
Paths must be visible to the DataNode process executing the query, and that process must have read permission. Specifying any DataNode data directory causes the query to fail.| +|`TABLE_NAME`|No|Name of the table to read. When specified, only valid files containing the target table's schema are read. If none of the valid files contains that schema, the query fails.
You can omit this argument when the table name can be inferred uniquely: every valid file to be read must contain exactly one table, and the inferred table name must be the same in all files. The query fails if a valid file contains multiple tables or if the unique table names differ between valid files.| +|`DEVICE_METADATA_INFO_SWAP_THRESHOLD`|No|When both the number of files and the number of devices are large, some metadata may be written to temporary swap files to limit memory use. This `Long` value sets the size threshold that forces a swap. The default is 8 MB.| + +**Schema Merging Rules** + +When reading multiple TsFiles, the system determines the target table and merges its schemas. The merged schema is used only as the output schema for the current query and is not registered in database metadata. The rules are: + +- TAG columns are merged in order and must have consistent prefixes. Different TAG names at the same position cause an error; additional TAG columns may be appended at later positions. +- The time-column name must be consistent across files; conflicting names cause an error. +- FIELD column order does not matter. Files can contain different FIELD columns, which are merged incrementally. FIELD columns with the same name must have compatible data types; otherwise, an error is reported. +- Columns with the same name in different TsFiles must have the same column category; otherwise, an error is reported. + +**Returned Results** + +- Returns the data of the specified table. +- Output columns come from the merged schema of the target table in the external TsFiles. +- The time column uses the time-column name recorded in the TsFiles. +- TAG columns represent device identifiers. +- FIELD columns contain measurement data. + +### 4.4 Usage Examples + +Assume `/data/backup/1.tsfile` exists and contains the metadata and data of `table1` from [Sample Data](../Reference/Sample-Data.md). + +**Example 1: Infer the Table Name** + +This example requires `/data/backup/1.tsfile` to contain exactly one table. + +```sql +SELECT * +FROM TABLE( + read_tsfile( + PATHS => '/data/backup/1.tsfile' + ) +) +LIMIT 10; +``` + +Result: + +```text ++-----------------------------+------+--------+---------+--------+-----------+-----------+--------+------+-----------------------------+ +| time|region|plant_id|device_id|model_id|maintenance|temperature|humidity|status| arrival_time| ++-----------------------------+------+--------+---------+--------+-----------+-----------+--------+------+-----------------------------+ +|2024-11-29T10:00:00.000+08:00| 上海| 3001| 101| D| 360| 85.0| null| null|2024-11-29T10:00:13.000+08:00| +|2024-11-29T11:00:00.000+08:00| 上海| 3002| 100| E| 180| null| 45.1| true| null| +|2024-11-29T18:30:00.000+08:00| 上海| 3002| 100| E| 180| 90.0| 35.4| true|2024-11-29T18:30:15.000+08:00| +|2024-11-30T09:30:00.000+08:00| 上海| 3002| 101| F| 360| 90.0| 35.2| true| null| +|2024-11-30T14:30:00.000+08:00| 上海| 3002| 101| F| 360| 90.0| 34.8| true|2024-11-30T14:30:17.000+08:00| +|2024-11-26T13:37:00.000+08:00| 北京| 1001| 100| A| 180| 90.0| 35.1| true|2024-11-26T13:37:34.000+08:00| +|2024-11-26T13:38:00.000+08:00| 北京| 1001| 100| A| 180| 90.0| 35.1| true|2024-11-26T13:38:25.000+08:00| +|2024-11-28T08:00:00.000+08:00| 上海| 3001| 100| C| 90| 85.0| null| null|2024-11-28T08:00:09.000+08:00| +|2024-11-28T09:00:00.000+08:00| 上海| 3001| 100| C| 90| null| 40.9| true| null| +|2024-11-28T10:00:00.000+08:00| 上海| 3001| 100| C| 90| 85.0| 35.2| null|2024-11-28T10:00:11.000+08:00| ++-----------------------------+------+--------+---------+--------+-----------+-----------+--------+------+-----------------------------+ +Total line number = 10 +It costs 0.159s +``` + +**Example 2: Read TsFiles from a Directory** + +```sql +SELECT time, device_id, temperature +FROM TABLE( + read_tsfile( + TABLE_NAME => 'table1', + PATHS => '/data/backup' + ) +) +WHERE time >= 2024-11-28 00:00:00 AND time < 2024-11-29 00:00:00 ; +``` + +Result: + +```text ++-----------------------------+---------+-----------+ +| time|device_id|temperature| ++-----------------------------+---------+-----------+ +|2024-11-28T08:00:00.000+08:00| 100| 85.0| +|2024-11-28T09:00:00.000+08:00| 100| null| +|2024-11-28T10:00:00.000+08:00| 100| 85.0| +|2024-11-28T11:00:00.000+08:00| 100| 88.0| ++-----------------------------+---------+-----------+ +Total line number = 4 +It costs 0.116s +``` + +**Example 3: Aggregate by TAG** + +```sql +SELECT device_id, count(temperature) +FROM TABLE( + read_tsfile( + TABLE_NAME => 'table1', + PATHS => '/data/backup' + ) +) +GROUP BY device_id; +``` + +Result: + +```text ++---------+-----+ +|device_id|_col1| ++---------+-----+ +| 100| 6| +| 101| 6| ++---------+-----+ +Total line number = 2 +It costs 0.049s +``` + +## 5. Time-Series Trend Matching Table Function + +### 5.1 Description + +The `pattern_match` table function searches a historical time series for subsequences that match an input pattern sequence and returns all matches satisfying the specified threshold, result bounds, and other conditions. + +> Supported since V2.0.12 + +### 5.2 Function Definition + +```sql +pattern_match( + data => {table_name | subquery} PARTITION BY partition_col ORDER BY time_col, + [time_col => 'time_column_name',] + data_col => 'data_column_name', + pattern => 'pattern_sequence', + smooth => numeric_value, + threshold => numeric_value, + [width => numeric_value,] + [height => numeric_value,] + [smooth_on_pattern => {true | false}] +) +``` + +### 5.3 Parameters + +|Parameter|Type|Required|Default|Description| +|---|---|---|---|---| +|`data`|Table name or subquery|Yes|-|Table or subquery containing the time series. **The time column must be ordered.** Supports `PARTITION BY` for partitioning and `ORDER BY` for sorting by time.| +|`time_col`|String|No|`'time'`|Name of the time column. **Only the TIMESTAMP type is supported.**| +|`data_col`|String|Yes|-|Name of the series column. Supported types: `INT32`, `INT64`, `DOUBLE`, and `FLOAT`.| +|`pattern`|String|Yes|-|Numeric sequence to match, supporting ordinary trend sequences and regular-expression rules:
1. Basic format: comma-separated integers or floating-point values, such as `'1.0,2.0,3.0'`.
2. Regular-expression extensions: `{segment}+` repeats a segment at least once, and `{segment}*` repeats it zero or more times. `{`, `}*`, and `}+` are separate units.
3. The leftmost point of each segment is shared with the preceding segment.| +|`smooth`|Non-negative real number|Yes|-|Tolerance for fluctuations (smoothing level). Larger values tolerate greater fluctuations but may oversmooth normal data. A recommended starting value is 1% of the value range; adjust it to the series.| +|`threshold`|Non-negative real number|Yes|-|Similarity threshold. Only matches with a similarity value below this threshold are returned. Smaller values require a closer match. Start at `1` and increase as needed.| +|`width`|Non-negative real number|No|Unlimited|Maximum width of a match. Only subsequences with a timestamp span below this value are returned.| +|`height`|Non-negative real number|No|Unlimited|Maximum height of a match. Only subsequences with a height below this value are returned.| +|`smooth_on_pattern`|Boolean|No|`false`|Whether to smooth the pattern:
1. `false`: treats the pattern as a trend shape and smooths only the original series.
2. `true`: applies the same smoothing and noise reduction to both the pattern and the original series.| + +**Returned Results** + +Only rows belonging to matching segments are retained, in ascending `match_index` order. Unmatched rows are discarded. + +|Column|Type|Description| +|---|---|---| +|`match_index`|`INT32`|Non-negative integer identifying the matched segment.| +|`similarity`|`DOUBLE`|Non-negative similarity value for the segment and pattern. Smaller values indicate closer matches.| +|All columns from `data`|Same as input|Original data from all columns of the input `data` argument.| + +### 5.4 Usage Examples + +The following examples demonstrate basic pattern matching, parameter adjustment, regular-expression patterns, and smoothing. + +#### 5.4.1 Prepare Test Data + +Create a table and insert data: + +```sql +create table test(value DOUBLE FIELD, value1 DOUBLE FIELD); +INSERT INTO test VALUES (1, 1, 0),(2, 2, 0),(3, 1, 0),(4, 1, 0),(5, 1, 0),(6, 1.2, 0),(7, 1, 0),(8, 1, 0),(9, 2, 0),(10, 3, 0),(11, 4, 0),(12, 3, 0),(13, 2, 0),(14, 3, 0),(15, 4, 0),(16, 2, 0),(17, 1, 0),(18, 1, 0),(19, 1, 0),(20, 1, 0),(21, 1, 0),(41, 1, 0),(42, 2, 0),(43, 3, 0),(44, 4, 0),(45, 3, 0),(46, 2, 0),(47, 2, 0),(48, 2, 0),(49, 2, 0),(50, 2, 0),(51, 2, 0),(52, 2, 0); +``` + +Query the data: + +```sql +select * from test; +``` + +The data is shown below: + +![](/img/featured-function-01-en.png) + +#### 5.4.2 Basic Trend Matching + +Use an ordinary sequence as the pattern to find subsequences with a similar trend. + +```sql +select * from pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,2.0,3.0,2.0,1.0,1.0,1.0,1.0,1.0', + smooth => 0.5, + threshold => 10.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern=> false +); +``` + +The matching results are shown below: + +![](/img/featured-function-02-en.png) + +The query returns 3 matching segments. A smaller similarity value indicates a closer match. + +```text ++-----------+------------------+-----------------------------+-----+------+ +|match_index| similarity| time|value|value1| ++-----------+------------------+-----------------------------+-----+------+ +| 0| 4.637180787192477|1970-01-01T08:00:00.001+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.002+08:00| 2.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.003+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.004+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.005+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.006+08:00| 1.2| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.007+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.008+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.013+08:00| 2.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.014+08:00| 3.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.015+08:00| 4.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.016+08:00| 2.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.017+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.018+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.019+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.020+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.021+08:00| 1.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.041+08:00| 1.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.042+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.043+08:00| 3.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.044+08:00| 4.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.045+08:00| 3.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.046+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.047+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.048+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.049+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.050+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.051+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.052+08:00| 2.0| 0.0| ++-----------+------------------+-----------------------------+-----+------+ +Total line number = 29 +It costs 0.126s +``` + +#### 5.4.3 Adjust Matching Conditions + +Each example below starts from the query in Section 5.4.2 and changes only the indicated argument. + +|Purpose|Parameter|Original Value|New Value|Effect| +|---|---|---|---|---| +|Require a closer match|`threshold`|`10.0`|`1.0`|Retains only results with similarity below `1.0`, reducing the number of matching segments from 3 to 2.| +|Limit the time span|`width`|`1000.0`|`10.0`|Returns only subsequences with a timestamp span below `10.0`.| +|Limit the value range|`height`|`500.0`|`2.0`|Returns only subsequences with a value range below `2.0`.| + +#### 5.4.4 Regular-Expression Patterns + +Regular-expression patterns can match repeated trend segments. + +|Repetition Symbol|Meaning| +|---|---| +|`+`|The preceding subsequence occurs at least once.| +|`*`|The preceding subsequence occurs zero or more times.| + +The following example uses `+` to match one or more occurrences of `2.0,3.0,2.0`: + +```sql +select * from pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,{2.0,3.0,2.0}+,1.0,1.0,1.0,1.0,1.0', + smooth => 0.5, + threshold => 100.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern => false +); +``` + +To allow zero or more occurrences of `2.0,3.0,2.0`, replace `+` with `*`: + +```sql +pattern => '1.0,{2.0,3.0,2.0}*,1.0,1.0,1.0,1.0,1.0' +``` + +Regular-expression patterns are useful for periodic fluctuations, repeated peaks, and trend matches of variable length. + +#### 5.4.5 Pattern Smoothing + +When the pattern contains small fluctuations, use `smooth_on_pattern` to control whether the pattern is also smoothed. + +The following examples show the results of two configurations: + +|Configuration|`threshold`|`smooth_on_pattern`|Matching Behavior| +|---|---|---|---| +|Smooth both the original series and the pattern|`1.0`|`true`|Matches the `1.0,1.2,1.0` fluctuation in the original data.| +|Smooth only the original series|`10.0`|`false`|Returns other trend matches but excludes the corresponding `1.0,1.2,1.0` fluctuation.| + +Smooth both the original series and the pattern: + +```sql +SELECT * +FROM pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,1.2,1.0', + smooth => 0.5, + threshold => 1.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern => true +); +``` + +With the same smoothing rules applied to both sequences, the query matches the `1.0,1.2,1.0` fluctuation at time points 5, 6, and 7. + +The results are shown below: + +![](/img/featured-function-03-en.png) + +Smooth only the original series: + +```sql +SELECT * +FROM pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,1.2,1.0', + smooth => 0.5, + threshold => 10.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern => false +); +``` + +With smoothing applied only to the original series, the query still returns other trend matches, but the `1.0,1.2,1.0` fluctuation at time points 5, 6, and 7 is not matched. + +The results are shown below: + +![](/img/featured-function-04-en.png) + +## 6. Frequency-Domain Analysis Functions + +### 6.1 FFT + +#### 6.1.1 Description + +`FFT` is a built-in table function in the table model. It performs a one-dimensional fast Fourier transform on one or more real-valued numeric series in each input partition. `ORDER BY` must specify the time column in ascending order. You can also use `PARTITION BY` to group data by device or TAG. Each partition generates its own frequency bins, and all numeric columns in the partition share the same frequency axis. + +> Supported since V2.0.12 + +#### 6.1.2 Function Definition + +Named-argument syntax: + +```sql +SELECT * +FROM FFT( + DATA => {table_name | subquery} + [PARTITION BY partition_column [, ...]] + ORDER BY time_column, + [SAMPLE_INTERVAL => duration_literal,] + [N => positive_integer,] + [NORM => {'backward' | 'forward' | 'ortho'},] + [TIMECOL => 'time_column'] +); +``` + +Positional-argument syntax: + +```sql +SELECT * +FROM TABLE( + FFT( + TABLE(table_name) + [PARTITION BY partition_column [, ...]] + ORDER BY time_column + [, duration_literal + [, positive_integer + [, norm + [, time_column_name]]]] + ) +); +``` + +The canonical argument order is `DATA, SAMPLE_INTERVAL, N, NORM, TIMECOL`. **Named arguments** are recommended to make complex calls easier to read. + +#### 6.1.3 Parameters + +|Parameter|Required|Type|Default|Description| +|---|---|---|---|---| +|`DATA`|Yes|Table argument|None|Input data for FFT. With `PARTITION BY`, each partition is calculated independently; without it, all input rows form one partition. All `INT32`, `INT64`, `FLOAT`, and `DOUBLE` columns except the time and partition columns participate in the calculation. Other column types are ignored. At least one numeric column is required, and participating columns cannot contain `NULL`. To transform only selected numeric columns, project them in an input subquery.| +|`SAMPLE_INTERVAL`|No|Positive duration literal|Inferred from the time column|Sampling interval used to calculate the frequency axis, such as `1ms`, `10ms`, or `1s`. If omitted, it is inferred per partition as `(last timestamp - first timestamp) / (input row count - 1)`. A single-row partition requires an explicit interval; an empty partition returns 0 rows.| +|`N`|No|Positive integer|Input row count of the current partition|FFT length. If smaller than the input row count, only the first `N` rows in timestamp order are transformed. If larger, the series is padded with zeros at the end. Each partition returns `N` rows. The maximum `N` is `65536`, and `N × 2 × number of participating numeric columns ≤ 16777216` must hold.| +|`NORM`|No|String|`backward`|Normalization mode, case-insensitive. `backward`: no normalization; `forward`: divide by `N`; `ortho`: divide by `√N`.| +|`TIMECOL`|No|String|`time`|Name of the time column, which must have type `TIMESTAMP`. `DATA` must be sorted only by this column in ascending order; `DESC` is unsupported. Timestamps within each partition must be strictly increasing, with no duplicates.| + +- FFT is generally intended for evenly sampled data. This function does not automatically detect or correct irregular sampling. Interpolate or resample the data before calculation to ensure accurate spectra. If the sampling interval is known, explicitly set `SAMPLE_INTERVAL`. +- When `N` is smaller than the input row count, the function still validates all input rows in the partition, although only the first `N` rows are transformed. + +**Returned Results** + +`FFT` returns the full two-sided spectrum for each partition, with columns in the following order: + +```text +partition_columns... +frequency_index +frequency +_real +_imag +... +``` + +|Output Column|Type|Description| +|---|---|---| +|Columns specified by `PARTITION BY`|Same as input|Retain their original names and types and appear first in the result. Omitted when `PARTITION BY` is not used.| +|`frequency_index`|`INT64`|Frequency-bin index, from `0` to `N-1`.| +|`frequency`|`DOUBLE`|Frequency of the current bin, in Hz.| +|`_real`|`DOUBLE`|Real part of the FFT for the corresponding numeric input column.| +|`_imag`|`DOUBLE`|Imaginary part of the FFT for the corresponding numeric input column.| + +For transform length `N` and sampling interval `d` in seconds, `frequency` is calculated as follows: + +|`frequency_index` Range|`frequency`| +|---|---| +|`frequency_index < ceil(N / 2)`|`frequency_index / (N × d)`| +|Otherwise|`(frequency_index - N) / (N × d)`| + +Frequencies are ordered as zero, positive, then negative frequencies, in Hz. All numeric columns within a partition share the same frequency axis. + +#### 6.1.4 Notes + +- The function name `FFT` is case-insensitive. Each partition performs a separate one-dimensional FFT. +- The current version supports only real-valued input. Complex input, `DFT`, and `IFFT` are unsupported. +- The current version returns only the real and imaginary parts of the full spectrum. One-sided spectra, amplitude output, and phase output are unsupported. +- The `VALUE`, `SAMPLE_RATE`, and `SPECTRUM` arguments are unsupported in the current version. + +#### 6.1.5 Usage Examples + +These examples use `table1`. Because `temperature` contains `NULL` values, filter them out in the input subquery. + +**Example 1: FFT by Device** + +```sql +SELECT * +FROM FFT( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE plant_id = '1001' + AND temperature IS NOT NULL + ) PARTITION BY device_id ORDER BY time +) +ORDER BY device_id, frequency_index; +``` + +The function transforms `temperature` separately for each device. With `N` and `SAMPLE_INTERVAL` omitted, the transform length is the input row count of each partition, and the sampling interval is inferred from the time column. In this example, the sampling interval is 1 minute. + +```text ++---------+---------------+---------------------+----------------------+---------------------+ +|device_id|frequency_index| frequency| temperature_real| temperature_imag| ++---------+---------------+---------------------+----------------------+---------------------+ +| 100| 0| 0.0| 180.0| 0.0| +| 100| 1|-0.008333333333333333| 0.0| 0.0| +| 101| 0| 0.0| 255.0| -6.67572021484375E-6| +| 101| 1| 0.005555555555555556|-4.6126147026370745E-6|-5.266308107820805E-6| +| 101| 2|-0.005555555555555556| -1.9073486328125E-6| 3.303624680484063E-6| ++---------+---------------+---------------------+----------------------+---------------------+ +``` + +**Example 2: Specify Transform Length and Normalization** + +```sql +SELECT * +FROM FFT( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE plant_id = '1001' + AND temperature IS NOT NULL + ) PARTITION BY device_id ORDER BY time, + SAMPLE_INTERVAL => 1m, + N => 4, + NORM => 'ortho' +) +ORDER BY device_id, frequency_index; +``` + +The transform length is set to 4 for each device. Series with fewer than 4 input rows are padded with zeros at the end. FFT results are normalized by `1/√N`. Each device returns 4 spectrum rows. + +```text ++---------+---------------+---------------------+----------------------+----------------+ +|device_id|frequency_index| frequency| temperature_real|temperature_imag| ++---------+---------------+---------------------+----------------------+----------------+ +| 100| 0| 0.0| 90.0| 0.0| +| 100| 1| 0.004166666666666667| 45.0| -45.0| +| 100| 2|-0.008333333333333333| 0.0| 0.0| +| 100| 3|-0.004166666666666667| 45.0| 45.0| +| 101| 0| 0.0| 127.5| 0.0| +| 101| 1| 0.004166666666666667| 2.602374475716698E-15| -42.5| +| 101| 2|-0.008333333333333333| 42.5| 0.0| +| 101| 3|-0.004166666666666667|-2.602374475716698E-15| 42.5| ++---------+---------------+---------------------+----------------------+----------------+ +``` + +**Example 3: Numeric Column Contains `NULL`** + +```sql +SELECT * +FROM FFT( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE plant_id = '1001' + ) PARTITION BY device_id ORDER BY time +); +``` + +The query fails because numeric columns participating in FFT cannot contain `NULL`: + +```text +Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: FFT does not support null values in column [temperature]. +``` + +Filter out null values with `IS NOT NULL` in the input subquery before running FFT. + +### 6.2 lowPass + +#### 6.2.1 Description + +`lowPass` is a low-pass filter that applies frequency-domain filtering to numeric columns in the input table. It retains low-frequency components and attenuates high-frequency components, making it useful for signal smoothing and high-frequency noise removal. The normalized passband frequency `wpass`, in the range `(0, 1)`, specifies the upper frequency bound of the passband. + +> Supported since V2.0.12 + +#### 6.2.2 Function Definition + +Named-argument syntax: + +```sql +SELECT * +FROM lowPass( + DATA => input_table PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column', + WPASS => passband_frequency +); +``` + +Positional-argument syntax: + +```sql +SELECT * +FROM lowPass( + input_table PARTITION BY partition_column ORDER BY time_column, + 'time_column', + passband_frequency +); +``` + +#### 6.2.3 Parameters + +|Parameter|Type|Required|Description| +|---|---|---|---| +|`DATA`|Table argument (`SET SEMANTIC`)|Yes|Input table or subquery. `ORDER BY` must contain only the time column in **ascending order**. `PARTITION BY` is optional; if omitted, the entire table is treated as one partition.| +|`TIMECOL`|String|Yes|Name of the time column. Must identify exactly one column of type `TIMESTAMP`.| +|`WPASS`|`DOUBLE`|Yes|Normalized passband frequency in `(0, 1)`. Components below this frequency are retained, and those above it are attenuated.| + +**Calculation Rules** + +- Columns specified by `TIMECOL` and `PARTITION BY` are excluded from calculations but retained in the output. +- Apart from the time and partition columns, only `INT32`, `INT64`, `FLOAT`, and `DOUBLE` columns can participate. Analysis fails if no eligible column remains or if any other column type is present. +- `NULL` values in a participating column are excluded from that column's filtering calculation. + +**Returned Results** + +- The output includes the partition columns, if specified, and the time column, with their original names and types. +- Each participating numeric column produces a filtered result column of type `DOUBLE`. Each result column has the same number of points as its corresponding input column, output in ascending timestamp order. + +#### 6.2.4 Usage Example + +The following example uses `table1`. + +```sql +SELECT * +FROM lowPass( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE temperature is not null + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + WPASS => 0.3 +); +``` + +The example partitions data by device, applies low-pass filtering to `temperature`, and returns `device_id`, `time`, and the filtered numeric column. + +```text ++---------+-----------------------------+--------------------+ +|device_id| time|lowpass(temperature)| ++---------+-----------------------------+--------------------+ +| 100|2024-11-26T13:37:00.000+08:00| 88.0| +| 100|2024-11-26T13:38:00.000+08:00| 88.0| +| 100|2024-11-28T08:00:00.000+08:00| 87.99999999999999| +| 100|2024-11-28T10:00:00.000+08:00| 87.99999999999999| +| 100|2024-11-28T11:00:00.000+08:00| 88.00000000000001| +| 100|2024-11-29T18:30:00.000+08:00| 88.0| +| 101|2024-11-27T16:39:00.000+08:00| 86.66666666666667| +| 101|2024-11-27T16:40:00.000+08:00| 86.66666666666667| +| 101|2024-11-27T16:41:00.000+08:00| 86.66666666666664| +| 101|2024-11-29T10:00:00.000+08:00| 86.66666666666664| +| 101|2024-11-30T09:30:00.000+08:00| 86.66666666666667| +| 101|2024-11-30T14:30:00.000+08:00| 86.66666666666664| ++---------+-----------------------------+--------------------+ +``` + +### 6.3 highPass + +#### 6.3.1 Description + +`highPass` is a high-pass filter that applies frequency-domain filtering to numeric columns in the input table. It retains high-frequency components and attenuates low-frequency components, making it useful for extracting rapid changes, abrupt transitions, and high-frequency noise. The normalized passband frequency `wpass`, in the range `(0, 1)`, specifies the lower frequency bound of the passband. + +> Supported since V2.0.12 + +#### 6.3.2 Function Definition + +Named-argument syntax: + +```sql +SELECT * +FROM highPass( + DATA => input_table PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column', + WPASS => passband_frequency +); +``` + +Positional-argument syntax: + +```sql +SELECT * +FROM highPass( + input_table PARTITION BY partition_column ORDER BY time_column, + 'time_column', + passband_frequency +); +``` + +#### 6.3.3 Parameters + +|Parameter|Type|Required|Description| +|---|---|---|---| +|`DATA`|Table argument (`SET SEMANTIC`)|Yes|Input table or subquery. `ORDER BY` must contain only the time column in ascending order. `PARTITION BY` is optional; if omitted, the entire table is treated as one partition.| +|`TIMECOL`|String|Yes|Name of the time column. Must identify exactly one column of type `TIMESTAMP`.| +|`WPASS`|`DOUBLE`|Yes|Normalized passband frequency in `(0, 1)`. Components above this frequency are retained, and those below it are attenuated.| + +**Input Columns and Calculation Rules** + +- Columns specified by `TIMECOL` and `PARTITION BY` are excluded from calculations but retained in the output. +- Apart from the time and partition columns, only `INT32`, `INT64`, `FLOAT`, and `DOUBLE` columns can participate. Analysis fails if no eligible column remains or if any other column type is present. +- `NULL` values in a participating column are excluded from that column's filtering calculation. + +**Returned Results** + +- The output includes the partition columns, if specified, and the time column, with their original names and types. +- Each participating numeric column produces a filtered result column of type `DOUBLE`. Each result column has the same number of points as its corresponding input column, output in ascending timestamp order. + +#### 6.3.4 Usage Example + +```sql +SELECT * +FROM highPass( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE temperature is not null + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + WPASS => 0.3 +); +``` + +The example partitions data by device, applies high-pass filtering to `temperature`, and returns `device_id`, `time`, and the filtered numeric column. + +```text ++---------+-----------------------------+----------------------+ +|device_id| time| highpass(temperature)| ++---------+-----------------------------+----------------------+ +| 100|2024-11-26T13:37:00.000+08:00| 2.000000000000029| +| 100|2024-11-26T13:38:00.000+08:00| 2.000000000000004| +| 100|2024-11-28T08:00:00.000+08:00| -2.9999999999999702| +| 100|2024-11-28T10:00:00.000+08:00| -3.000000000000013| +| 100|2024-11-28T11:00:00.000+08:00|-4.182831670630972E-14| +| 100|2024-11-29T18:30:00.000+08:00| 1.9999999999999953| +| 101|2024-11-27T16:39:00.000+08:00| -1.666666666666642| +| 101|2024-11-27T16:40:00.000+08:00| -1.6666666666666519| +| 101|2024-11-27T16:41:00.000+08:00| -1.666666666666645| +| 101|2024-11-29T10:00:00.000+08:00| -1.666666666666701| +| 101|2024-11-30T09:30:00.000+08:00| 3.3333333333333015| +| 101|2024-11-30T14:30:00.000+08:00| 3.333333333333338| ++---------+-----------------------------+----------------------+ +``` + +## 7. Time-Series Correlation Analysis Functions + +### 7.1 Xcorr + +#### 7.1.1 Description + +`Xcorr` performs cross-correlation analysis on two numeric series to measure their shape similarity at different time lags. It shifts one series relative to the other, multiplies corresponding points, and sums the products to produce a similarity curve. This can reveal delays and similar patterns between two signals. + +> Supported since V2.0.12 + +#### 7.1.2 Function Definition + +Named-argument syntax: + +```sql +SELECT * +FROM Xcorr( + DATA => ( + SELECT time_column, signal_1, signal_2, partition_column + FROM input_table + ) PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column' +); +``` + +Positional-argument syntax: + +```sql +SELECT * +FROM Xcorr( + ( SELECT time_column, signal_1, signal_2, partition_column + FROM input_table + ) PARTITION BY partition_column ORDER BY time_column, + 'time_column' +); +``` + +#### 7.1.3 Parameters + +|Parameter|Type|Required|Description| +|---|---|---|---| +|`DATA`|Table argument (`SET SEMANTIC`)|Yes|Input table or subquery. `ORDER BY` must specify the time column in ascending order. `PARTITION BY` is optional. Exactly two numeric columns must remain after excluding the time and partition columns.| +|`TIMECOL`|String|Yes|Name of the time column. Must identify exactly one column of type `TIMESTAMP`.| + +**Calculation Rules** + +- The time and partition columns are excluded from cross-correlation calculations. +- Exactly two columns must remain after those columns are excluded. Both must be of type `INT32`, `INT64`, `FLOAT`, or `DOUBLE`; otherwise, analysis fails. +- `NULL` values in either participating column are treated as `0` at that position. +- Timestamps must be strictly increasing within each partition. +- Normalization is applied according to the function definition. + +**Returned Results** + +- Partition columns specified by `PARTITION BY`, if any, retain their original names and types. +- One result column of type `DOUBLE` is generated for the two participating columns. + +#### 7.1.4 Usage Example + +The following example uses `table1` from the SQL manual's sample data. A subquery selects the two numeric series, `temperature` and `humidity`, for cross-correlation. + +```sql +SELECT * +FROM Xcorr( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE temperature IS NOT NULL + AND humidity IS NOT NULL + ) + PARTITION BY device_id + ORDER BY time, + TIMECOL => 'time' +); +``` + +The example partitions data by device, cross-correlates `temperature` and `humidity`, and returns `device_id` and the correlation result column. + +```text ++---------+----------------------------+ +|device_id|xcorr(temperature, humidity)| ++---------+----------------------------+ +| 100| 3186.0001373291016| +| 100| 3622.5| +| 100| 3412.0000203450522| +| 100| 3318.9249839782715| +| 100| 3292.9599586486815| +| 100| 3324.7749156951904| +| 100| 3080.0999348958335| +| 100| 3123.8998641967773| +| 100| 3158.9998626708984| +| 101| 2957.9999351501465| +| 101| 3061.9999980926514| +| 101| 3100.166645050049| +| 101| 3172.5| +| 101| 3176.999931335449| ++---------+----------------------------+ +``` diff --git a/src/UserGuide/latest-Table/SQL-Manual/Featured-Functions_apache.md b/src/UserGuide/latest-Table/SQL-Manual/Featured-Functions_apache.md index fd91d58ef..500cbfba4 100644 --- a/src/UserGuide/latest-Table/SQL-Manual/Featured-Functions_apache.md +++ b/src/UserGuide/latest-Table/SQL-Manual/Featured-Functions_apache.md @@ -210,6 +210,202 @@ GROUP BY 1, device_id; +---------+---------+--------+ ``` +### 1.3 `M4` Function + +#### 1.3.1 Description + +`M4` is a built-in polymorphic table function in the table model for downsampling time-series data. For each window, it extracts the first, last, minimum (bottom), and maximum (top) points to reduce the number of returned points while preserving the shape of the trend. `M4` takes a table argument and returns a result table, so it must be called in the `FROM` clause. + +- First point: the point with the earliest timestamp and a non-`NULL` value in the window. +- Last point: the point with the latest timestamp and a non-`NULL` value in the window. +- Minimum and maximum points: the points with the smallest and largest values in the window. If multiple points have the same value, the first point encountered in the input scan order is retained. +- Both time windows and point-count windows are supported. A duration literal for `SIZE`, such as `1h` or `10m`, selects time-window mode; a positive integer, such as `100`, selects point-count-window mode. + +> Supported since V2.0.12 + +#### 1.3.2 Function Definition + +```sql +SELECT * +FROM M4( + DATA => input_table PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column', + [ORIGIN => origin_timestamp,] + SIZE => window_duration | window_point_count, + [SLIDE => window_duration | window_point_count] +); +``` + +`DATA` is a set-semantic table argument. `ORDER BY` is required and must contain only the time column specified by `TIMECOL`, in ascending order. `PARTITION BY` is optional; if omitted, the entire input table is treated as one partition. Arguments can be passed by name or in declaration order. Named arguments are recommended. + +#### 1.3.3 Parameters + +|Parameter|Type|Required|Description| +|---|---|---|---| +|`DATA`|Table argument (`SET SEMANTIC`)|Yes|Input table or subquery. Supports `PARTITION BY` and `ORDER BY`.| +|`TIMECOL`|String|Yes|Name of the time column. The column must be of type `TIMESTAMP`, and `ORDER BY` must contain only this column.| +|`ORIGIN`|Timestamp|No|Alignment origin for time windows. Defaults to `0`. Not used in point-count-window mode.| +|`SIZE`|Duration or `INT64`|Yes|Duration of a time window or number of points in a point-count window. Must be positive.| +|`SLIDE`|Same type as `SIZE`|No|Window sliding step. Defaults to `SIZE` and must use the same window mode as `SIZE`.| + +**Calculation Rules** + +- The column specified by `TIMECOL` is excluded from M4 calculations. +- Columns specified by `PARTITION BY` are excluded from calculations but retained in the output. +- All remaining columns of comparable types participate in M4 calculations. +- After excluding the time and partition columns, analysis fails if no comparable column remains or if any remaining column has a non-comparable type. +- Records with a `NULL` value in a participating column are excluded from that column's `first`, `last`, `bottom`, and `top` calculations. +- For each participating column, the `first`, `last`, `bottom`, and `top` points are calculated, deduplicated, and output in ascending timestamp order. + +**Returned Results** + +- Time-window mode always generates `window_start` and `window_end`, both of type `TIMESTAMP`, to represent the interval `[window_start, window_end)`. +- Point-count-window mode always generates `window_index`, of type `INT64`. Window indices are calculated independently within each `PARTITION BY` partition, starting at `0`. +- Partition columns retain their original names and types and appear in declaration order. `OBJECT` columns cannot be partition columns. `BLOB` partition columns can be retained in the output but do not participate in M4 calculations. +- For each participating column `c`, two output columns are generated: `c_time` for the point's timestamp and `c` for its value. Their types match the corresponding input types. Results for multiple columns are expanded in input-column order. + +The number of output rows in a window equals the largest number of feature points among all participating columns. For columns with fewer feature points, the remaining `c_time` and `c` cells are filled with `NULL`. + +#### 1.3.4 Usage Examples + +The following examples use `table1` from [Sample Data](../Reference/Sample-Data.md). Because `table1` contains additional columns besides the time and partition columns, a subquery selects only `time`, `device_id`, `temperature`, and `humidity` for M4 calculations. + +**Example 1: Time Windows** + +For `device_id = '101'`, divide the data into 3-minute windows. `SIZE => 3m` selects time-window mode with a duration of 3 minutes. Each half-open interval `[window_start, window_end)` extracts the first, last, minimum, and maximum points for `temperature` and `humidity`, then outputs the points in ascending timestamp order. + +```sql +SELECT window_start, + window_end, + device_id, + temperature_time, + temperature, + humidity_time, + humidity +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + AND time >= 2024-11-27 16:38:00 + AND time <= 2024-11-27 16:44:00 + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + SIZE => 3m +); +``` + +Result: + +```text ++-----------------------------+-----------------------------+---------+-----------------------------+-----------+-----------------------------+--------+ +| window_start| window_end|device_id| temperature_time|temperature| humidity_time|humidity| ++-----------------------------+-----------------------------+---------+-----------------------------+-----------+-----------------------------+--------+ +|2024-11-27T16:36:00.000+08:00|2024-11-27T16:39:00.000+08:00| 101| null| null|2024-11-27T16:38:00.000+08:00| 35.1| +|2024-11-27T16:39:00.000+08:00|2024-11-27T16:42:00.000+08:00| 101|2024-11-27T16:39:00.000+08:00| 85.0|2024-11-27T16:39:00.000+08:00| 35.3| +|2024-11-27T16:39:00.000+08:00|2024-11-27T16:42:00.000+08:00| 101|2024-11-27T16:41:00.000+08:00| 85.0| null| null| +|2024-11-27T16:42:00.000+08:00|2024-11-27T16:45:00.000+08:00| 101| null| null|2024-11-27T16:42:00.000+08:00| 35.2| ++-----------------------------+-----------------------------+---------+-----------------------------+-----------+-----------------------------+--------+ +``` + +**Example 2: Point-Count Windows** + +For `device_id = '101'`, divide the data into windows of 3 points. `SIZE => 3` selects point-count-window mode, with 3 input rows per window. `window_index` identifies each window and starts at `0` within each partition. + +```sql +SELECT window_index, + device_id, + temperature_time, + temperature, + humidity_time, + humidity +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + AND time >= 2024-11-27 16:38:00 + AND time <= 2024-11-27 16:44:00 + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + SIZE => 3 +); +``` + +Result: + +```text ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +|window_index|device_id| temperature_time|temperature| humidity_time|humidity| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +| 0| 101|2024-11-27T16:39:00.000+08:00| 85.0|2024-11-27T16:38:00.000+08:00| 35.1| +| 0| 101|2024-11-27T16:40:00.000+08:00| 85.0|2024-11-27T16:39:00.000+08:00| 35.3| +| 1| 101|2024-11-27T16:41:00.000+08:00| 85.0|2024-11-27T16:42:00.000+08:00| 35.2| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +``` + +To specify the sliding step, also set `SLIDE`: + +```sql +SELECT window_index, + device_id, + temperature_time, + temperature, + humidity_time, + humidity +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + AND time >= 2024-11-27 16:38:00 + AND time <= 2024-11-27 16:44:00 + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + SIZE => 3, + SLIDE => 2 +); +``` + +This call uses a window size of 3 points and advances the window by 2 points each time. + +Result: + +```text ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +|window_index|device_id| temperature_time|temperature| humidity_time|humidity| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +| 0| 101|2024-11-27T16:39:00.000+08:00| 85.0|2024-11-27T16:38:00.000+08:00| 35.1| +| 0| 101|2024-11-27T16:40:00.000+08:00| 85.0|2024-11-27T16:39:00.000+08:00| 35.3| +| 1| 101|2024-11-27T16:40:00.000+08:00| 85.0|2024-11-27T16:42:00.000+08:00| 35.2| +| 1| 101|2024-11-27T16:41:00.000+08:00| 85.0| null| null| +| 2| 101| null| null|2024-11-27T16:42:00.000+08:00| 35.2| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +``` + +**Example 3: Invalid Sort Column** + +`M4` requires `ORDER BY` on the `DATA` argument, and the sort column must match the time column specified by `TIMECOL`. The following example incorrectly sorts by `temperature`: + +```sql +SELECT * +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + ) PARTITION BY device_id ORDER BY temperature, + TIMECOL => 'time', + SIZE => 3m +); +``` + +Error: + +```text +Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: The ORDER BY clause of the DATA argument must contain exactly the time column specified by the TIMECOL argument. +``` + ## 2. `DIFF` Function ### 2.1 **Description:** @@ -521,27 +717,47 @@ IoTDB> SELECT first(time) as window_start, last(time) as window_end, stock_id, a #### Function Description -The CAPACITY function groups data into fixed-size windows, where each window contains up to SIZE rows. +`CAPACITY` divides data into windows by point count (row count), with at most `SIZE` rows per window. Since V2.0.12, the optional `SLIDE` argument specifies the number of rows between the start positions of adjacent windows. #### Function Definition ```sql -CAPACITY(data [PARTITION BY(pkeys, ...)] [ORDER BY(okeys, ...)], size) +CAPACITY( + DATA => + [PARTITION BY [, ...]] + [ORDER BY [, ...]], + SIZE => + [, SLIDE => ] +) ``` #### Parameter Description -| Parameter | Type | Attributes | Description | -| ----------- | -------- | ---------------------------- | -------------------------------------- | -| DATA | Table | SET SEMANTIC, PASS THROUGH | Input table with partition/sort keys | -| SIZE | Scalar | Long integer | Window size (row count) | +|Parameter|Type|Required|Description| +|---|---|---|---| +|`DATA`|Table|Yes|Input table or subquery. Supports `PARTITION BY` and `ORDER BY` and passes through input columns.| +|`SIZE`|`INT64` scalar|Yes|Window capacity. Must be positive and specifies the maximum number of rows in a window.| +|`SLIDE`|`INT64` scalar|No|Window sliding step. Must be positive when specified. Defaults to `SIZE` when omitted.| + +- With `PARTITION BY`, row numbers and window indices are calculated independently within each partition, starting at `0`. +- With `ORDER BY`, row numbers follow the specified sort order. +- Window indices start at `0`. Window `k` covers the row-number interval `[k * SLIDE, k * SLIDE + SIZE)`. +- Window behavior depends on the relationship between `SLIDE` and `SIZE`: + +|Relationship|Window Type|Behavior| +|---|---|---| +|`SLIDE < SIZE`|Overlapping windows|Adjacent windows overlap. An input row can belong to multiple windows and appear multiple times with different `window_index` values.| +|`SLIDE = SIZE`|Non-overlapping windows|Adjacent windows are contiguous. This matches the behavior of `CAPACITY(DATA => ..., SIZE => n)` in earlier versions.| +|`SLIDE > SIZE`|Gapped windows|Gaps exist between adjacent windows. Input rows that fall into a gap are omitted from the output.| #### Returned Results -The CAPACITY function returns: +`CAPACITY` returns the following columns: -* `window_index`: Window identifier -* Pass-through columns: All input columns from DATA +- `window_index`: window index of type `INT64`, starting at `0`. +- Columns passed through from `DATA`, with their original names and types. + +You can query the result directly or aggregate it by `window_index` and business grouping columns. #### Usage Example @@ -558,7 +774,7 @@ IoTDB> SELECT * FROM CAPACITY(DATA => bid PARTITION BY stock_id ORDER BY time, S | 1|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +------------+-----------------------------+--------+-----+ --- Equivalent to tree model's GROUP BY COUNT when combined with GROUP BY +-- Combine with GROUP BY, equivalent to GROUP BY COUNT in the tree model IoTDB> SELECT first(time) as start_time, last(time) as end_time, stock_id, avg(price) as avg FROM CAPACITY(DATA => bid PARTITION BY stock_id ORDER BY time, SIZE => 2) GROUP BY window_index, stock_id; +-----------------------------+-----------------------------+--------+-----+ | start_time| end_time|stock_id| avg| @@ -568,6 +784,23 @@ IoTDB> SELECT first(time) as start_time, last(time) as end_time, stock_id, avg(p |2021-01-01T09:05:00.000+08:00|2021-01-01T09:07:00.000+08:00| AAPL|101.5| |2021-01-01T09:09:00.000+08:00|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +-----------------------------+-----------------------------+--------+-----+ + +-- Use SLIDE to generate overlapping windows (SLIDE < SIZE) +IoTDB> SELECT * FROM CAPACITY(DATA => bid PARTITION BY stock_id ORDER BY time, SIZE => 2, SLIDE => 1); ++------------+-----------------------------+--------+-----+ +|window_index| time|stock_id|price| ++------------+-----------------------------+--------+-----+ +| 0|2021-01-01T09:05:00.000+08:00| AAPL|100.0| +| 0|2021-01-01T09:07:00.000+08:00| AAPL|103.0| +| 1|2021-01-01T09:07:00.000+08:00| AAPL|103.0| +| 1|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +| 2|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +| 0|2021-01-01T09:06:00.000+08:00| TESL|200.0| +| 0|2021-01-01T09:07:00.000+08:00| TESL|202.0| +| 1|2021-01-01T09:07:00.000+08:00| TESL|202.0| +| 1|2021-01-01T09:15:00.000+08:00| TESL|195.0| +| 2|2021-01-01T09:15:00.000+08:00| TESL|195.0| ++------------+-----------------------------+--------+-----+ ``` ### 3.5 TUMBLE @@ -694,3 +927,834 @@ IoTDB> SELECT window_start, window_end, stock_id, avg(price) as avg FROM CUMULAT +-----------------------------+-----------------------------+--------+------------------+ ``` + +## 4. `read_tsfile` Table Function + +### 4.1 Description + +`read_tsfile` reads table-model data from external TsFile files or directories and returns a temporary table source. You can use `SELECT`, `WHERE`, `ORDER BY`, `LIMIT`, `OFFSET`, and aggregation as you would with an ordinary table for read-only analysis and temporary processing. Results are not written back to the external TsFiles, and internal IoTDB data is not modified. This function does not support writing, deleting, modifying, or registering external TsFiles. + +> Supported since V2.0.12 + +### 4.2 Function Definition + +```sql +SELECT * +FROM TABLE( + read_tsfile( + TABLE_NAME => '', + PATHS => '' + ) +); +``` + +### 4.3 Parameters + +|Parameter|Required|Description| +|---|---|---| +|`PATHS`|Yes|Path to a TsFile or directory. Pass a single path as a string. For multiple paths, separate them with commas within the same string, for example `'/data/a.tsfile,/data/b.tsfile,/data/history'`.
- For a file path, the system attempts to open the file directly.
- For a directory, the system recursively scans files with the `.tsfile` suffix and identifies valid TsFiles by the magic numbers at the beginning and end of each file. Files that are unrecognized, incomplete, not in TsFile format, or not TsFile V4 are excluded from the query.
Paths must be visible to the DataNode process executing the query, and that process must have read permission. Specifying any DataNode data directory causes the query to fail.| +|`TABLE_NAME`|No|Name of the table to read. When specified, only valid files containing the target table's schema are read. If none of the valid files contains that schema, the query fails.
You can omit this argument when the table name can be inferred uniquely: every valid file to be read must contain exactly one table, and the inferred table name must be the same in all files. The query fails if a valid file contains multiple tables or if the unique table names differ between valid files.| +|`DEVICE_METADATA_INFO_SWAP_THRESHOLD`|No|When both the number of files and the number of devices are large, some metadata may be written to temporary swap files to limit memory use. This `Long` value sets the size threshold that forces a swap. The default is 8 MB.| + +**Schema Merging Rules** + +When reading multiple TsFiles, the system determines the target table and merges its schemas. The merged schema is used only as the output schema for the current query and is not registered in database metadata. The rules are: + +- TAG columns are merged in order and must have consistent prefixes. Different TAG names at the same position cause an error; additional TAG columns may be appended at later positions. +- The time-column name must be consistent across files; conflicting names cause an error. +- FIELD column order does not matter. Files can contain different FIELD columns, which are merged incrementally. FIELD columns with the same name must have compatible data types; otherwise, an error is reported. +- Columns with the same name in different TsFiles must have the same column category; otherwise, an error is reported. + +**Returned Results** + +- Returns the data of the specified table. +- Output columns come from the merged schema of the target table in the external TsFiles. +- The time column uses the time-column name recorded in the TsFiles. +- TAG columns represent device identifiers. +- FIELD columns contain measurement data. + +### 4.4 Usage Examples + +Assume `/data/backup/1.tsfile` exists and contains the metadata and data of `table1` from [Sample Data](../Reference/Sample-Data.md). + +**Example 1: Infer the Table Name** + +This example requires `/data/backup/1.tsfile` to contain exactly one table. + +```sql +SELECT * +FROM TABLE( + read_tsfile( + PATHS => '/data/backup/1.tsfile' + ) +) +LIMIT 10; +``` + +Result: + +```text ++-----------------------------+------+--------+---------+--------+-----------+-----------+--------+------+-----------------------------+ +| time|region|plant_id|device_id|model_id|maintenance|temperature|humidity|status| arrival_time| ++-----------------------------+------+--------+---------+--------+-----------+-----------+--------+------+-----------------------------+ +|2024-11-29T10:00:00.000+08:00| 上海| 3001| 101| D| 360| 85.0| null| null|2024-11-29T10:00:13.000+08:00| +|2024-11-29T11:00:00.000+08:00| 上海| 3002| 100| E| 180| null| 45.1| true| null| +|2024-11-29T18:30:00.000+08:00| 上海| 3002| 100| E| 180| 90.0| 35.4| true|2024-11-29T18:30:15.000+08:00| +|2024-11-30T09:30:00.000+08:00| 上海| 3002| 101| F| 360| 90.0| 35.2| true| null| +|2024-11-30T14:30:00.000+08:00| 上海| 3002| 101| F| 360| 90.0| 34.8| true|2024-11-30T14:30:17.000+08:00| +|2024-11-26T13:37:00.000+08:00| 北京| 1001| 100| A| 180| 90.0| 35.1| true|2024-11-26T13:37:34.000+08:00| +|2024-11-26T13:38:00.000+08:00| 北京| 1001| 100| A| 180| 90.0| 35.1| true|2024-11-26T13:38:25.000+08:00| +|2024-11-28T08:00:00.000+08:00| 上海| 3001| 100| C| 90| 85.0| null| null|2024-11-28T08:00:09.000+08:00| +|2024-11-28T09:00:00.000+08:00| 上海| 3001| 100| C| 90| null| 40.9| true| null| +|2024-11-28T10:00:00.000+08:00| 上海| 3001| 100| C| 90| 85.0| 35.2| null|2024-11-28T10:00:11.000+08:00| ++-----------------------------+------+--------+---------+--------+-----------+-----------+--------+------+-----------------------------+ +Total line number = 10 +It costs 0.159s +``` + +**Example 2: Read TsFiles from a Directory** + +```sql +SELECT time, device_id, temperature +FROM TABLE( + read_tsfile( + TABLE_NAME => 'table1', + PATHS => '/data/backup' + ) +) +WHERE time >= 2024-11-28 00:00:00 AND time < 2024-11-29 00:00:00 ; +``` + +Result: + +```text ++-----------------------------+---------+-----------+ +| time|device_id|temperature| ++-----------------------------+---------+-----------+ +|2024-11-28T08:00:00.000+08:00| 100| 85.0| +|2024-11-28T09:00:00.000+08:00| 100| null| +|2024-11-28T10:00:00.000+08:00| 100| 85.0| +|2024-11-28T11:00:00.000+08:00| 100| 88.0| ++-----------------------------+---------+-----------+ +Total line number = 4 +It costs 0.116s +``` + +**Example 3: Aggregate by TAG** + +```sql +SELECT device_id, count(temperature) +FROM TABLE( + read_tsfile( + TABLE_NAME => 'table1', + PATHS => '/data/backup' + ) +) +GROUP BY device_id; +``` + +Result: + +```text ++---------+-----+ +|device_id|_col1| ++---------+-----+ +| 100| 6| +| 101| 6| ++---------+-----+ +Total line number = 2 +It costs 0.049s +``` + +## 5. Time-Series Trend Matching Table Function + +### 5.1 Description + +The `pattern_match` table function searches a historical time series for subsequences that match an input pattern sequence and returns all matches satisfying the specified threshold, result bounds, and other conditions. + +> Supported since V2.0.12 + +### 5.2 Function Definition + +```sql +pattern_match( + data => {table_name | subquery} PARTITION BY partition_col ORDER BY time_col, + [time_col => 'time_column_name',] + data_col => 'data_column_name', + pattern => 'pattern_sequence', + smooth => numeric_value, + threshold => numeric_value, + [width => numeric_value,] + [height => numeric_value,] + [smooth_on_pattern => {true | false}] +) +``` + +### 5.3 Parameters + +|Parameter|Type|Required|Default|Description| +|---|---|---|---|---| +|`data`|Table name or subquery|Yes|-|Table or subquery containing the time series. **The time column must be ordered.** Supports `PARTITION BY` for partitioning and `ORDER BY` for sorting by time.| +|`time_col`|String|No|`'time'`|Name of the time column. **Only the TIMESTAMP type is supported.**| +|`data_col`|String|Yes|-|Name of the series column. Supported types: `INT32`, `INT64`, `DOUBLE`, and `FLOAT`.| +|`pattern`|String|Yes|-|Numeric sequence to match, supporting ordinary trend sequences and regular-expression rules:
1. Basic format: comma-separated integers or floating-point values, such as `'1.0,2.0,3.0'`.
2. Regular-expression extensions: `{segment}+` repeats a segment at least once, and `{segment}*` repeats it zero or more times. `{`, `}*`, and `}+` are separate units.
3. The leftmost point of each segment is shared with the preceding segment.| +|`smooth`|Non-negative real number|Yes|-|Tolerance for fluctuations (smoothing level). Larger values tolerate greater fluctuations but may oversmooth normal data. A recommended starting value is 1% of the value range; adjust it to the series.| +|`threshold`|Non-negative real number|Yes|-|Similarity threshold. Only matches with a similarity value below this threshold are returned. Smaller values require a closer match. Start at `1` and increase as needed.| +|`width`|Non-negative real number|No|Unlimited|Maximum width of a match. Only subsequences with a timestamp span below this value are returned.| +|`height`|Non-negative real number|No|Unlimited|Maximum height of a match. Only subsequences with a height below this value are returned.| +|`smooth_on_pattern`|Boolean|No|`false`|Whether to smooth the pattern:
1. `false`: treats the pattern as a trend shape and smooths only the original series.
2. `true`: applies the same smoothing and noise reduction to both the pattern and the original series.| + +**Returned Results** + +Only rows belonging to matching segments are retained, in ascending `match_index` order. Unmatched rows are discarded. + +|Column|Type|Description| +|---|---|---| +|`match_index`|`INT32`|Non-negative integer identifying the matched segment.| +|`similarity`|`DOUBLE`|Non-negative similarity value for the segment and pattern. Smaller values indicate closer matches.| +|All columns from `data`|Same as input|Original data from all columns of the input `data` argument.| + +### 5.4 Usage Examples + +The following examples demonstrate basic pattern matching, parameter adjustment, regular-expression patterns, and smoothing. + +#### 5.4.1 Prepare Test Data + +Create a table and insert data: + +```sql +create table test(value DOUBLE FIELD, value1 DOUBLE FIELD); +INSERT INTO test VALUES (1, 1, 0),(2, 2, 0),(3, 1, 0),(4, 1, 0),(5, 1, 0),(6, 1.2, 0),(7, 1, 0),(8, 1, 0),(9, 2, 0),(10, 3, 0),(11, 4, 0),(12, 3, 0),(13, 2, 0),(14, 3, 0),(15, 4, 0),(16, 2, 0),(17, 1, 0),(18, 1, 0),(19, 1, 0),(20, 1, 0),(21, 1, 0),(41, 1, 0),(42, 2, 0),(43, 3, 0),(44, 4, 0),(45, 3, 0),(46, 2, 0),(47, 2, 0),(48, 2, 0),(49, 2, 0),(50, 2, 0),(51, 2, 0),(52, 2, 0); +``` + +Query the data: + +```sql +select * from test; +``` + +The data is shown below: + +![](/img/featured-function-01-en.png) + +#### 5.4.2 Basic Trend Matching + +Use an ordinary sequence as the pattern to find subsequences with a similar trend. + +```sql +select * from pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,2.0,3.0,2.0,1.0,1.0,1.0,1.0,1.0', + smooth => 0.5, + threshold => 10.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern=> false +); +``` + +The matching results are shown below: + +![](/img/featured-function-02-en.png) + +The query returns 3 matching segments. A smaller similarity value indicates a closer match. + +```text ++-----------+------------------+-----------------------------+-----+------+ +|match_index| similarity| time|value|value1| ++-----------+------------------+-----------------------------+-----+------+ +| 0| 4.637180787192477|1970-01-01T08:00:00.001+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.002+08:00| 2.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.003+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.004+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.005+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.006+08:00| 1.2| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.007+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.008+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.013+08:00| 2.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.014+08:00| 3.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.015+08:00| 4.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.016+08:00| 2.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.017+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.018+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.019+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.020+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.021+08:00| 1.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.041+08:00| 1.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.042+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.043+08:00| 3.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.044+08:00| 4.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.045+08:00| 3.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.046+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.047+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.048+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.049+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.050+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.051+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.052+08:00| 2.0| 0.0| ++-----------+------------------+-----------------------------+-----+------+ +Total line number = 29 +It costs 0.126s +``` + +#### 5.4.3 Adjust Matching Conditions + +Each example below starts from the query in Section 5.4.2 and changes only the indicated argument. + +|Purpose|Parameter|Original Value|New Value|Effect| +|---|---|---|---|---| +|Require a closer match|`threshold`|`10.0`|`1.0`|Retains only results with similarity below `1.0`, reducing the number of matching segments from 3 to 2.| +|Limit the time span|`width`|`1000.0`|`10.0`|Returns only subsequences with a timestamp span below `10.0`.| +|Limit the value range|`height`|`500.0`|`2.0`|Returns only subsequences with a value range below `2.0`.| + +#### 5.4.4 Regular-Expression Patterns + +Regular-expression patterns can match repeated trend segments. + +|Repetition Symbol|Meaning| +|---|---| +|`+`|The preceding subsequence occurs at least once.| +|`*`|The preceding subsequence occurs zero or more times.| + +The following example uses `+` to match one or more occurrences of `2.0,3.0,2.0`: + +```sql +select * from pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,{2.0,3.0,2.0}+,1.0,1.0,1.0,1.0,1.0', + smooth => 0.5, + threshold => 100.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern => false +); +``` + +To allow zero or more occurrences of `2.0,3.0,2.0`, replace `+` with `*`: + +```sql +pattern => '1.0,{2.0,3.0,2.0}*,1.0,1.0,1.0,1.0,1.0' +``` + +Regular-expression patterns are useful for periodic fluctuations, repeated peaks, and trend matches of variable length. + +#### 5.4.5 Pattern Smoothing + +When the pattern contains small fluctuations, use `smooth_on_pattern` to control whether the pattern is also smoothed. + +The following examples show the results of two configurations: + +|Configuration|`threshold`|`smooth_on_pattern`|Matching Behavior| +|---|---|---|---| +|Smooth both the original series and the pattern|`1.0`|`true`|Matches the `1.0,1.2,1.0` fluctuation in the original data.| +|Smooth only the original series|`10.0`|`false`|Returns other trend matches but excludes the corresponding `1.0,1.2,1.0` fluctuation.| + +Smooth both the original series and the pattern: + +```sql +SELECT * +FROM pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,1.2,1.0', + smooth => 0.5, + threshold => 1.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern => true +); +``` + +With the same smoothing rules applied to both sequences, the query matches the `1.0,1.2,1.0` fluctuation at time points 5, 6, and 7. + +The results are shown below: + +![](/img/featured-function-03-en.png) + +Smooth only the original series: + +```sql +SELECT * +FROM pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,1.2,1.0', + smooth => 0.5, + threshold => 10.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern => false +); +``` + +With smoothing applied only to the original series, the query still returns other trend matches, but the `1.0,1.2,1.0` fluctuation at time points 5, 6, and 7 is not matched. + +The results are shown below: + +![](/img/featured-function-04-en.png) + +## 6. Frequency-Domain Analysis Functions + +### 6.1 FFT + +#### 6.1.1 Description + +`FFT` is a built-in table function in the table model. It performs a one-dimensional fast Fourier transform on one or more real-valued numeric series in each input partition. `ORDER BY` must specify the time column in ascending order. You can also use `PARTITION BY` to group data by device or TAG. Each partition generates its own frequency bins, and all numeric columns in the partition share the same frequency axis. + +> Supported since V2.0.12 + +#### 6.1.2 Function Definition + +Named-argument syntax: + +```sql +SELECT * +FROM FFT( + DATA => {table_name | subquery} + [PARTITION BY partition_column [, ...]] + ORDER BY time_column, + [SAMPLE_INTERVAL => duration_literal,] + [N => positive_integer,] + [NORM => {'backward' | 'forward' | 'ortho'},] + [TIMECOL => 'time_column'] +); +``` + +Positional-argument syntax: + +```sql +SELECT * +FROM TABLE( + FFT( + TABLE(table_name) + [PARTITION BY partition_column [, ...]] + ORDER BY time_column + [, duration_literal + [, positive_integer + [, norm + [, time_column_name]]]] + ) +); +``` + +The canonical argument order is `DATA, SAMPLE_INTERVAL, N, NORM, TIMECOL`. **Named arguments** are recommended to make complex calls easier to read. + +#### 6.1.3 Parameters + +|Parameter|Required|Type|Default|Description| +|---|---|---|---|---| +|`DATA`|Yes|Table argument|None|Input data for FFT. With `PARTITION BY`, each partition is calculated independently; without it, all input rows form one partition. All `INT32`, `INT64`, `FLOAT`, and `DOUBLE` columns except the time and partition columns participate in the calculation. Other column types are ignored. At least one numeric column is required, and participating columns cannot contain `NULL`. To transform only selected numeric columns, project them in an input subquery.| +|`SAMPLE_INTERVAL`|No|Positive duration literal|Inferred from the time column|Sampling interval used to calculate the frequency axis, such as `1ms`, `10ms`, or `1s`. If omitted, it is inferred per partition as `(last timestamp - first timestamp) / (input row count - 1)`. A single-row partition requires an explicit interval; an empty partition returns 0 rows.| +|`N`|No|Positive integer|Input row count of the current partition|FFT length. If smaller than the input row count, only the first `N` rows in timestamp order are transformed. If larger, the series is padded with zeros at the end. Each partition returns `N` rows. The maximum `N` is `65536`, and `N × 2 × number of participating numeric columns ≤ 16777216` must hold.| +|`NORM`|No|String|`backward`|Normalization mode, case-insensitive. `backward`: no normalization; `forward`: divide by `N`; `ortho`: divide by `√N`.| +|`TIMECOL`|No|String|`time`|Name of the time column, which must have type `TIMESTAMP`. `DATA` must be sorted only by this column in ascending order; `DESC` is unsupported. Timestamps within each partition must be strictly increasing, with no duplicates.| + +- FFT is generally intended for evenly sampled data. This function does not automatically detect or correct irregular sampling. Interpolate or resample the data before calculation to ensure accurate spectra. If the sampling interval is known, explicitly set `SAMPLE_INTERVAL`. +- When `N` is smaller than the input row count, the function still validates all input rows in the partition, although only the first `N` rows are transformed. + +**Returned Results** + +`FFT` returns the full two-sided spectrum for each partition, with columns in the following order: + +```text +partition_columns... +frequency_index +frequency +_real +_imag +... +``` + +|Output Column|Type|Description| +|---|---|---| +|Columns specified by `PARTITION BY`|Same as input|Retain their original names and types and appear first in the result. Omitted when `PARTITION BY` is not used.| +|`frequency_index`|`INT64`|Frequency-bin index, from `0` to `N-1`.| +|`frequency`|`DOUBLE`|Frequency of the current bin, in Hz.| +|`_real`|`DOUBLE`|Real part of the FFT for the corresponding numeric input column.| +|`_imag`|`DOUBLE`|Imaginary part of the FFT for the corresponding numeric input column.| + +For transform length `N` and sampling interval `d` in seconds, `frequency` is calculated as follows: + +|`frequency_index` Range|`frequency`| +|---|---| +|`frequency_index < ceil(N / 2)`|`frequency_index / (N × d)`| +|Otherwise|`(frequency_index - N) / (N × d)`| + +Frequencies are ordered as zero, positive, then negative frequencies, in Hz. All numeric columns within a partition share the same frequency axis. + +#### 6.1.4 Notes + +- The function name `FFT` is case-insensitive. Each partition performs a separate one-dimensional FFT. +- The current version supports only real-valued input. Complex input, `DFT`, and `IFFT` are unsupported. +- The current version returns only the real and imaginary parts of the full spectrum. One-sided spectra, amplitude output, and phase output are unsupported. +- The `VALUE`, `SAMPLE_RATE`, and `SPECTRUM` arguments are unsupported in the current version. + +#### 6.1.5 Usage Examples + +These examples use `table1`. Because `temperature` contains `NULL` values, filter them out in the input subquery. + +**Example 1: FFT by Device** + +```sql +SELECT * +FROM FFT( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE plant_id = '1001' + AND temperature IS NOT NULL + ) PARTITION BY device_id ORDER BY time +) +ORDER BY device_id, frequency_index; +``` + +The function transforms `temperature` separately for each device. With `N` and `SAMPLE_INTERVAL` omitted, the transform length is the input row count of each partition, and the sampling interval is inferred from the time column. In this example, the sampling interval is 1 minute. + +```text ++---------+---------------+---------------------+----------------------+---------------------+ +|device_id|frequency_index| frequency| temperature_real| temperature_imag| ++---------+---------------+---------------------+----------------------+---------------------+ +| 100| 0| 0.0| 180.0| 0.0| +| 100| 1|-0.008333333333333333| 0.0| 0.0| +| 101| 0| 0.0| 255.0| -6.67572021484375E-6| +| 101| 1| 0.005555555555555556|-4.6126147026370745E-6|-5.266308107820805E-6| +| 101| 2|-0.005555555555555556| -1.9073486328125E-6| 3.303624680484063E-6| ++---------+---------------+---------------------+----------------------+---------------------+ +``` + +**Example 2: Specify Transform Length and Normalization** + +```sql +SELECT * +FROM FFT( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE plant_id = '1001' + AND temperature IS NOT NULL + ) PARTITION BY device_id ORDER BY time, + SAMPLE_INTERVAL => 1m, + N => 4, + NORM => 'ortho' +) +ORDER BY device_id, frequency_index; +``` + +The transform length is set to 4 for each device. Series with fewer than 4 input rows are padded with zeros at the end. FFT results are normalized by `1/√N`. Each device returns 4 spectrum rows. + +```text ++---------+---------------+---------------------+----------------------+----------------+ +|device_id|frequency_index| frequency| temperature_real|temperature_imag| ++---------+---------------+---------------------+----------------------+----------------+ +| 100| 0| 0.0| 90.0| 0.0| +| 100| 1| 0.004166666666666667| 45.0| -45.0| +| 100| 2|-0.008333333333333333| 0.0| 0.0| +| 100| 3|-0.004166666666666667| 45.0| 45.0| +| 101| 0| 0.0| 127.5| 0.0| +| 101| 1| 0.004166666666666667| 2.602374475716698E-15| -42.5| +| 101| 2|-0.008333333333333333| 42.5| 0.0| +| 101| 3|-0.004166666666666667|-2.602374475716698E-15| 42.5| ++---------+---------------+---------------------+----------------------+----------------+ +``` + +**Example 3: Numeric Column Contains `NULL`** + +```sql +SELECT * +FROM FFT( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE plant_id = '1001' + ) PARTITION BY device_id ORDER BY time +); +``` + +The query fails because numeric columns participating in FFT cannot contain `NULL`: + +```text +Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: FFT does not support null values in column [temperature]. +``` + +Filter out null values with `IS NOT NULL` in the input subquery before running FFT. + +### 6.2 lowPass + +#### 6.2.1 Description + +`lowPass` is a low-pass filter that applies frequency-domain filtering to numeric columns in the input table. It retains low-frequency components and attenuates high-frequency components, making it useful for signal smoothing and high-frequency noise removal. The normalized passband frequency `wpass`, in the range `(0, 1)`, specifies the upper frequency bound of the passband. + +> Supported since V2.0.12 + +#### 6.2.2 Function Definition + +Named-argument syntax: + +```sql +SELECT * +FROM lowPass( + DATA => input_table PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column', + WPASS => passband_frequency +); +``` + +Positional-argument syntax: + +```sql +SELECT * +FROM lowPass( + input_table PARTITION BY partition_column ORDER BY time_column, + 'time_column', + passband_frequency +); +``` + +#### 6.2.3 Parameters + +|Parameter|Type|Required|Description| +|---|---|---|---| +|`DATA`|Table argument (`SET SEMANTIC`)|Yes|Input table or subquery. `ORDER BY` must contain only the time column in **ascending order**. `PARTITION BY` is optional; if omitted, the entire table is treated as one partition.| +|`TIMECOL`|String|Yes|Name of the time column. Must identify exactly one column of type `TIMESTAMP`.| +|`WPASS`|`DOUBLE`|Yes|Normalized passband frequency in `(0, 1)`. Components below this frequency are retained, and those above it are attenuated.| + +**Calculation Rules** + +- Columns specified by `TIMECOL` and `PARTITION BY` are excluded from calculations but retained in the output. +- Apart from the time and partition columns, only `INT32`, `INT64`, `FLOAT`, and `DOUBLE` columns can participate. Analysis fails if no eligible column remains or if any other column type is present. +- `NULL` values in a participating column are excluded from that column's filtering calculation. + +**Returned Results** + +- The output includes the partition columns, if specified, and the time column, with their original names and types. +- Each participating numeric column produces a filtered result column of type `DOUBLE`. Each result column has the same number of points as its corresponding input column, output in ascending timestamp order. + +#### 6.2.4 Usage Example + +The following example uses `table1`. + +```sql +SELECT * +FROM lowPass( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE temperature is not null + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + WPASS => 0.3 +); +``` + +The example partitions data by device, applies low-pass filtering to `temperature`, and returns `device_id`, `time`, and the filtered numeric column. + +```text ++---------+-----------------------------+--------------------+ +|device_id| time|lowpass(temperature)| ++---------+-----------------------------+--------------------+ +| 100|2024-11-26T13:37:00.000+08:00| 88.0| +| 100|2024-11-26T13:38:00.000+08:00| 88.0| +| 100|2024-11-28T08:00:00.000+08:00| 87.99999999999999| +| 100|2024-11-28T10:00:00.000+08:00| 87.99999999999999| +| 100|2024-11-28T11:00:00.000+08:00| 88.00000000000001| +| 100|2024-11-29T18:30:00.000+08:00| 88.0| +| 101|2024-11-27T16:39:00.000+08:00| 86.66666666666667| +| 101|2024-11-27T16:40:00.000+08:00| 86.66666666666667| +| 101|2024-11-27T16:41:00.000+08:00| 86.66666666666664| +| 101|2024-11-29T10:00:00.000+08:00| 86.66666666666664| +| 101|2024-11-30T09:30:00.000+08:00| 86.66666666666667| +| 101|2024-11-30T14:30:00.000+08:00| 86.66666666666664| ++---------+-----------------------------+--------------------+ +``` + +### 6.3 highPass + +#### 6.3.1 Description + +`highPass` is a high-pass filter that applies frequency-domain filtering to numeric columns in the input table. It retains high-frequency components and attenuates low-frequency components, making it useful for extracting rapid changes, abrupt transitions, and high-frequency noise. The normalized passband frequency `wpass`, in the range `(0, 1)`, specifies the lower frequency bound of the passband. + +> Supported since V2.0.12 + +#### 6.3.2 Function Definition + +Named-argument syntax: + +```sql +SELECT * +FROM highPass( + DATA => input_table PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column', + WPASS => passband_frequency +); +``` + +Positional-argument syntax: + +```sql +SELECT * +FROM highPass( + input_table PARTITION BY partition_column ORDER BY time_column, + 'time_column', + passband_frequency +); +``` + +#### 6.3.3 Parameters + +|Parameter|Type|Required|Description| +|---|---|---|---| +|`DATA`|Table argument (`SET SEMANTIC`)|Yes|Input table or subquery. `ORDER BY` must contain only the time column in ascending order. `PARTITION BY` is optional; if omitted, the entire table is treated as one partition.| +|`TIMECOL`|String|Yes|Name of the time column. Must identify exactly one column of type `TIMESTAMP`.| +|`WPASS`|`DOUBLE`|Yes|Normalized passband frequency in `(0, 1)`. Components above this frequency are retained, and those below it are attenuated.| + +**Input Columns and Calculation Rules** + +- Columns specified by `TIMECOL` and `PARTITION BY` are excluded from calculations but retained in the output. +- Apart from the time and partition columns, only `INT32`, `INT64`, `FLOAT`, and `DOUBLE` columns can participate. Analysis fails if no eligible column remains or if any other column type is present. +- `NULL` values in a participating column are excluded from that column's filtering calculation. + +**Returned Results** + +- The output includes the partition columns, if specified, and the time column, with their original names and types. +- Each participating numeric column produces a filtered result column of type `DOUBLE`. Each result column has the same number of points as its corresponding input column, output in ascending timestamp order. + +#### 6.3.4 Usage Example + +```sql +SELECT * +FROM highPass( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE temperature is not null + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + WPASS => 0.3 +); +``` + +The example partitions data by device, applies high-pass filtering to `temperature`, and returns `device_id`, `time`, and the filtered numeric column. + +```text ++---------+-----------------------------+----------------------+ +|device_id| time| highpass(temperature)| ++---------+-----------------------------+----------------------+ +| 100|2024-11-26T13:37:00.000+08:00| 2.000000000000029| +| 100|2024-11-26T13:38:00.000+08:00| 2.000000000000004| +| 100|2024-11-28T08:00:00.000+08:00| -2.9999999999999702| +| 100|2024-11-28T10:00:00.000+08:00| -3.000000000000013| +| 100|2024-11-28T11:00:00.000+08:00|-4.182831670630972E-14| +| 100|2024-11-29T18:30:00.000+08:00| 1.9999999999999953| +| 101|2024-11-27T16:39:00.000+08:00| -1.666666666666642| +| 101|2024-11-27T16:40:00.000+08:00| -1.6666666666666519| +| 101|2024-11-27T16:41:00.000+08:00| -1.666666666666645| +| 101|2024-11-29T10:00:00.000+08:00| -1.666666666666701| +| 101|2024-11-30T09:30:00.000+08:00| 3.3333333333333015| +| 101|2024-11-30T14:30:00.000+08:00| 3.333333333333338| ++---------+-----------------------------+----------------------+ +``` + +## 7. Time-Series Correlation Analysis Functions + +### 7.1 Xcorr + +#### 7.1.1 Description + +`Xcorr` performs cross-correlation analysis on two numeric series to measure their shape similarity at different time lags. It shifts one series relative to the other, multiplies corresponding points, and sums the products to produce a similarity curve. This can reveal delays and similar patterns between two signals. + +> Supported since V2.0.12 + +#### 7.1.2 Function Definition + +Named-argument syntax: + +```sql +SELECT * +FROM Xcorr( + DATA => ( + SELECT time_column, signal_1, signal_2, partition_column + FROM input_table + ) PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column' +); +``` + +Positional-argument syntax: + +```sql +SELECT * +FROM Xcorr( + ( SELECT time_column, signal_1, signal_2, partition_column + FROM input_table + ) PARTITION BY partition_column ORDER BY time_column, + 'time_column' +); +``` + +#### 7.1.3 Parameters + +|Parameter|Type|Required|Description| +|---|---|---|---| +|`DATA`|Table argument (`SET SEMANTIC`)|Yes|Input table or subquery. `ORDER BY` must specify the time column in ascending order. `PARTITION BY` is optional. Exactly two numeric columns must remain after excluding the time and partition columns.| +|`TIMECOL`|String|Yes|Name of the time column. Must identify exactly one column of type `TIMESTAMP`.| + +**Calculation Rules** + +- The time and partition columns are excluded from cross-correlation calculations. +- Exactly two columns must remain after those columns are excluded. Both must be of type `INT32`, `INT64`, `FLOAT`, or `DOUBLE`; otherwise, analysis fails. +- `NULL` values in either participating column are treated as `0` at that position. +- Timestamps must be strictly increasing within each partition. +- Normalization is applied according to the function definition. + +**Returned Results** + +- Partition columns specified by `PARTITION BY`, if any, retain their original names and types. +- One result column of type `DOUBLE` is generated for the two participating columns. + +#### 7.1.4 Usage Example + +The following example uses `table1` from the SQL manual's sample data. A subquery selects the two numeric series, `temperature` and `humidity`, for cross-correlation. + +```sql +SELECT * +FROM Xcorr( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE temperature IS NOT NULL + AND humidity IS NOT NULL + ) + PARTITION BY device_id + ORDER BY time, + TIMECOL => 'time' +); +``` + +The example partitions data by device, cross-correlates `temperature` and `humidity`, and returns `device_id` and the correlation result column. + +```text ++---------+----------------------------+ +|device_id|xcorr(temperature, humidity)| ++---------+----------------------------+ +| 100| 3186.0001373291016| +| 100| 3622.5| +| 100| 3412.0000203450522| +| 100| 3318.9249839782715| +| 100| 3292.9599586486815| +| 100| 3324.7749156951904| +| 100| 3080.0999348958335| +| 100| 3123.8998641967773| +| 100| 3158.9998626708984| +| 101| 2957.9999351501465| +| 101| 3061.9999980926514| +| 101| 3100.166645050049| +| 101| 3172.5| +| 101| 3176.999931335449| ++---------+----------------------------+ +``` diff --git a/src/zh/UserGuide/Master/Table/SQL-Manual/Featured-Functions_apache.md b/src/zh/UserGuide/Master/Table/SQL-Manual/Featured-Functions_apache.md index 20abca659..105c30828 100644 --- a/src/zh/UserGuide/Master/Table/SQL-Manual/Featured-Functions_apache.md +++ b/src/zh/UserGuide/Master/Table/SQL-Manual/Featured-Functions_apache.md @@ -213,6 +213,213 @@ GROUP BY 1, device_id; +---------+---------+--------+ ``` +### 1.3 `M4` 函数 + +#### 1.3.1 功能描述 + +`M4` 是表模型内置的多态表值函数,用于对时序数据进行降采样。函数在每个窗口内提取首点(First)、尾点(Last)、最小值点(Bottom)和最大值点(Top),在减少返回数据量的同时尽量保持趋势图形状。与标量函数或聚合函数不同,`M4` 接收一个表参数并返回结果表,必须在 `FROM` 子句中调用。 + +- 首点:窗口内时间戳最小且值不为 `NULL` 的点。 + +- 尾点:窗口内时间戳最大且值不为 `NULL` 的点。 + +- 最小值点和最大值点:窗口内值最小或最大的点;值相同时保留按输入扫描顺序遇到的第一个点。 + +- 支持时间窗口和点数窗口两种模式。`SIZE` 使用时间长度字面量(例如 `1h`、`10m`)时为时间窗口;使用正整数(例如 `100`)时为点数窗口。 + +> V2.0.12 版本起支持 + +#### 1.3.2 函数定义 + +```sql +SELECT * +FROM M4( + DATA => input_table PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column', + [ORIGIN => origin_timestamp,] + SIZE => window_duration | window_point_count, + [SLIDE => window_duration | window_point_count] +); +``` + +`DATA` 是集合语义表参数。使用时必须指定 `ORDER BY`,且排序列只能是 `TIMECOL` 指定的时间列并按升序排列;`PARTITION BY` 可选,不指定时整张输入表作为一个分区处理。参数可按名称或按声明顺序传递,建议使用命名参数。 + +#### 1.3.3 参数说明 + +|参数|类型|必填|说明| +|---|---|---|---| +|`DATA`|表参数(SET SEMANTIC)|是|输入表或子查询。可指定 `PARTITION BY` 和 `ORDER BY`。| +|`TIMECOL`|字符串|是|时间列名。该列必须为 `TIMESTAMP` 类型,且 `ORDER BY` 只能包含该列。| +|`ORIGIN`|时间戳|否|时间窗口的对齐原点,默认值为 `0`。点数窗口模式不使用该参数。| +|`SIZE`|时间长度或 `INT64`|是|时间窗口的窗口长度,或点数窗口的点数大小;必须为正数。| +|`SLIDE`|与 `SIZE` 同类型|否|窗口滑动步长,默认与 `SIZE` 相同。必须与 `SIZE` 使用相同窗口模式。| + +**计算规则** + +- `TIMECOL` 指定列不参与 M4 计算。 + +- `PARTITION BY` 指定列不参与计算,但保留在输出结果中。 + +- 除上述列外,所有可比较类型列均参与 M4 计算。 + +- 排除上述列后,若无可比较类型列,或存在不可比较类型列,分析阶段直接报错。 + +- 参与列值为 `NULL` 的记录,不参与该列的 `first`、`last`、`bottom`、`top` 计算。 + +- 各参与列先计算并去重 `first`、`last`、`bottom`、`top` 特征点,再按时间戳升序输出。 + +**返回结果** + +- 时间窗口模式:固定生成 `window_start`、`window_end`(时间戳类型),表示窗口范围 `[window_start, window_end)`。 + +- 点数窗口模式:固定生成 `window_index`(长整数类型),表示窗口序号;在每个 `PARTITION BY` 分区内独立计算,从 `0` 开始递增。 + +- PARTITION BY 列:按原列名、原类型保留输出,多个列按声明顺序排列。`OBJECT` 类型不支持作为分区列;`BLOB` 类型可保留输出,但不参与 M4 计算。 + +- 动态生成列:每个参与 M4 计算的列 `c` 生成 `c_time`(特征点时间戳)和 `c`(特征点值)两列,类型与输入列保持一致。多列结果按输入列顺序展开。 + +补充说明:窗口输出行数取所有参与列特征点数量的最大值。特征点较少的列,其剩余行的 `c_time` 和 `c` 填充 `NULL`。 + +#### 1.3.4 使用示例 + +以下示例均使用[示例数据](../Reference/Sample-Data.md)中的 `table1`。由于 `table1` 中除时间列和分区列外还包含其他字段,因此示例通过子查询仅选择 `time`、`device_id`、`temperature` 和 `humidity` 参与 M4 计算。 + +- 示例 1:时间窗口模式 + +以 `device_id = '101'` 的数据为例,每 3 分钟划分一个窗口。`SIZE => 3m` 表示使用时间窗口模式,窗口长度为 3 分钟。窗口采用半开区间 `[window_start, window_end)`,每个窗口分别提取 `temperature` 和 `humidity` 列的首点、尾点、最小值点和最大值点,并按照特征点时间戳升序输出。 + +```sql +SELECT window_start, + window_end, + device_id, + temperature_time, + temperature, + humidity_time, + humidity +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + AND time >= 2024-11-27 16:38:00 + AND time <= 2024-11-27 16:44:00 + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + SIZE => 3m +); +``` + +结果: + +```text ++-----------------------------+-----------------------------+---------+-----------------------------+-----------+-----------------------------+--------+ +| window_start| window_end|device_id| temperature_time|temperature| humidity_time|humidity| ++-----------------------------+-----------------------------+---------+-----------------------------+-----------+-----------------------------+--------+ +|2024-11-27T16:36:00.000+08:00|2024-11-27T16:39:00.000+08:00| 101| null| null|2024-11-27T16:38:00.000+08:00| 35.1| +|2024-11-27T16:39:00.000+08:00|2024-11-27T16:42:00.000+08:00| 101|2024-11-27T16:39:00.000+08:00| 85.0|2024-11-27T16:39:00.000+08:00| 35.3| +|2024-11-27T16:39:00.000+08:00|2024-11-27T16:42:00.000+08:00| 101|2024-11-27T16:41:00.000+08:00| 85.0| null| null| +|2024-11-27T16:42:00.000+08:00|2024-11-27T16:45:00.000+08:00| 101| null| null|2024-11-27T16:42:00.000+08:00| 35.2| ++-----------------------------+-----------------------------+---------+-----------------------------+-----------+-----------------------------+--------+ +``` + +- 示例 2:点数窗口模式 + +以 `device_id = '101'` 的数据为例,每 3 个数据点划分一个窗口。`SIZE => 3` 表示使用点数窗口模式,每 3 行数据划分一个窗口。窗口序号通过 `window_index` 标识,并在每个分区内从 `0` 开始计算。 + +```sql +SELECT window_index, + device_id, + temperature_time, + temperature, + humidity_time, + humidity +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + AND time >= 2024-11-27 16:38:00 + AND time <= 2024-11-27 16:44:00 + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + SIZE => 3 +); +``` + +结果: + +```text ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +|window_index|device_id| temperature_time|temperature| humidity_time|humidity| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +| 0| 101|2024-11-27T16:39:00.000+08:00| 85.0|2024-11-27T16:38:00.000+08:00| 35.1| +| 0| 101|2024-11-27T16:40:00.000+08:00| 85.0|2024-11-27T16:39:00.000+08:00| 35.3| +| 1| 101|2024-11-27T16:41:00.000+08:00| 85.0|2024-11-27T16:42:00.000+08:00| 35.2| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +``` + +如果需要设置窗口滑动步长,可以同时指定 `SLIDE`: + +```sql +SELECT window_index, + device_id, + temperature_time, + temperature, + humidity_time, + humidity +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + AND time >= 2024-11-27 16:38:00 + AND time <= 2024-11-27 16:44:00 + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + SIZE => 3, + SLIDE => 2 +); +``` + +上述调用表示窗口大小为 3 个数据点,窗口每次向后滑动 2 个数据点。 + +结果: + +```text ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +|window_index|device_id| temperature_time|temperature| humidity_time|humidity| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +| 0| 101|2024-11-27T16:39:00.000+08:00| 85.0|2024-11-27T16:38:00.000+08:00| 35.1| +| 0| 101|2024-11-27T16:40:00.000+08:00| 85.0|2024-11-27T16:39:00.000+08:00| 35.3| +| 1| 101|2024-11-27T16:40:00.000+08:00| 85.0|2024-11-27T16:42:00.000+08:00| 35.2| +| 1| 101|2024-11-27T16:41:00.000+08:00| 85.0| null| null| +| 2| 101| null| null|2024-11-27T16:42:00.000+08:00| 35.2| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +``` + +- 示例 3:非法示例——`ORDER BY` 未指定时间列 + +`M4` 要求 `DATA` 参数必须指定 `ORDER BY`,且排序列必须与 `TIMECOL` 参数指定的时间列一致。下面的示例错误地使用 `temperature` 作为排序列: + +```sql +SELECT * +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + ) PARTITION BY device_id ORDER BY temperature, + TIMECOL => 'time', + SIZE => 3m +); +``` + +报错: + +```text +Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: The ORDER BY clause of the DATA argument must contain exactly the time column specified by the TIMECOL argument. +``` + ## 2. DIFF函数 ### 2.1 功能概述 @@ -522,27 +729,51 @@ IoTDB> SELECT first(time) as window_start, last(time) as window_end, stock_id, a #### 3.4.1 功能描述 -CAPACITY 函数用于按数据点数(行数)分窗,每个窗口最多有 SIZE 行数据。 +CAPACITY 函数用于按数据点数(行数)分窗,每个窗口最多有 SIZE 行数据。自 V2.0.12 起支持通过参数 SLIDE 指定相邻窗口起点之间间隔的行数。 #### 3.4.2 函数定义 ```sql -CAPACITY(data [PARTITION BY(pkeys, ...)] [ORDER BY(okeys, ...)], size) +CAPACITY( + DATA => + [PARTITION BY [, ...]] + [ORDER BY [, ...]], + SIZE => + [, SLIDE => ] +) ``` #### 3.4.3 参数说明 -| 参数名 | 参数类型 | 参数属性 | 描述 | -| -------- | ---------- | -------------------------- | ---------------------------------------- | -| DATA | 表参数 | SET SEMANTICPASS THROUGH | 输入表通过 pkeys、okeys 指定分区和排序 | -| SIZE | 标量参数 | 长整数类型 | 窗口大小 | +|参数|类型|是否必填|说明| +|---|---|---|---| +|DATA|Table|是|输入表或子查询,支持 PARTITION BY 和 ORDER BY,透传输入列。| +|SIZE|INT64 Scalar|是|窗口容量,必须为正数,表示单个窗口最多覆盖的行数。| +|SLIDE|INT64 Scalar|否|窗口滑动步长,显式传入时必须为正数;省略时默认等于 SIZE。| + +- 指定 PARTITION BY 时,每个分区独立从 0 开始计算行号和窗口编号; + +- 指定 ORDER BY 时,按排序结果确定行号顺序。 + +- 窗口编号从 0 开始,第 k 个窗口覆盖的行号范围为 `[k * SLIDE, k * SLIDE + SIZE)`。 + +- 不同参数关系对应的窗口行为如下: + +|参数关系|窗口类型|行为| +|---|---|---| +|`SLIDE < SIZE`|重叠窗口|相邻窗口有重叠,同一输入行可能属于多个窗口,并以不同的 `window_index` 输出多行。| +|`SLIDE = SIZE`|非重叠窗口|相邻窗口首尾相接,行为与历史版本的 CAPACITY(DATA => ..., SIZE => n) 一致。| +|`SLIDE > SIZE`|间隔窗口|相邻窗口之间存在空档,落在空档内的输入行不输出。| #### 3.4.4 返回结果 CAPACITY 函数的返回结果列包含: -* window\_index: 窗口编号 -* 映射列:DATA 参数的所有输入列 +- window_index: 窗口编号,为 INT64 类型,从 0 开始。 + +- DATA 参数透传列:保持输入表对应列的名称和类型。 + +返回结果可直接查询,也可继续基于 window_index 和业务分组列进行聚合。 #### 3.4.5 使用示例 @@ -569,6 +800,23 @@ IoTDB> SELECT first(time) as start_time, last(time) as end_time, stock_id, avg(p |2021-01-01T09:05:00.000+08:00|2021-01-01T09:07:00.000+08:00| AAPL|101.5| |2021-01-01T09:09:00.000+08:00|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +-----------------------------+-----------------------------+--------+-----+ + +-- 使用 SLIDE 参数生成重叠窗口(SLIDE < SIZE) +IoTDB> SELECT * FROM CAPACITY(DATA => bid PARTITION BY stock_id ORDER BY time, SIZE => 2, SLIDE => 1); ++------------+-----------------------------+--------+-----+ +|window_index| time|stock_id|price| ++------------+-----------------------------+--------+-----+ +| 0|2021-01-01T09:05:00.000+08:00| AAPL|100.0| +| 0|2021-01-01T09:07:00.000+08:00| AAPL|103.0| +| 1|2021-01-01T09:07:00.000+08:00| AAPL|103.0| +| 1|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +| 2|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +| 0|2021-01-01T09:06:00.000+08:00| TESL|200.0| +| 0|2021-01-01T09:07:00.000+08:00| TESL|202.0| +| 1|2021-01-01T09:07:00.000+08:00| TESL|202.0| +| 1|2021-01-01T09:15:00.000+08:00| TESL|195.0| +| 2|2021-01-01T09:15:00.000+08:00| TESL|195.0| ++------------+-----------------------------+--------+-----+ ``` ### 3.5 TUMBLE @@ -695,3 +943,856 @@ IoTDB> SELECT window_start, window_end, stock_id, avg(price) as avg FROM CUMULAT +-----------------------------+-----------------------------+--------+------------------+ ``` + +## 4. `read_tsfile` 表值函数 + +### 4.1 功能概述 + +用于从外部 TsFile 文件或目录读取表模型数据。`read_tsfile` 返回一个临时表数据源,查询时可像普通表一样使用 `SELECT`、`WHERE`、`ORDER BY`、`LIMIT`、`OFFSET`、聚合等能力,对外部 TsFile 数据进行只读分析和临时处理,不会将处理结果写回外部 TsFile,也不会修改 IoTDB 内部数据,不支持通过该入口写入、删除、修改或注册外部 TsFile。 + +> V2.0.12 版本起支持 + +### 4.2 函数定义 + +```sql +SELECT * +FROM TABLE( + read_tsfile( + TABLE_NAME => '', + PATHS => '' + ) +); +``` + +### 4.3 参数说明 + +|参数|必填|说明| +|---|---|---| +|`PATHS`|是|TsFile 文件路径或目录路径。单路径直接传入字符串;多路径在同一个字符串中使用英文逗号分隔,例如 `'/data/a.tsfile,/data/b.tsfile,/data/history'`。
- 指定文件时,系统会直接尝试打开该文件;
- 指定目录时,系统会递归遍历目录下以 `.tsfile` 为后缀的文件,并根据文件首尾的 MAGIC NUMBER 识别有效 TsFile。文件内容不符合 TsFile 格式、无法识别、不完整或版本不是 TsFile V4 的文件不参与本次查询。
注意:指定的路径必须对执行查询的 DataNode 进程可见,并且 DataNode 进程需要具备相应的文件读取权限。禁止指定 DataNode 的任意数据目录,否则查询会报错。| +|`TABLE_NAME`|否|需要读取的表名。填写该参数时,系统只读取包含目标表 Schema 的有效文件;如果所有有效文件中都不存在目标表 Schema,查询报错。
当外部 TsFile 中可以唯一推断出待读取的表名时,可以省略该参数;省略时要求每个参与读取的有效文件中都有且只有一个表,并且所有有效文件推断出的表名一致。如果某个有效文件包含多个表,或者不同有效文件中的唯一表名不一致,查询报错。| +|`DEVICE_METADATA_INFO_SWAP_THRESHOLD` |否|查询时如果文件数和设备数量都很多,为了避免占用过多内存可能会将一些信息写成交换文件,这个参数可指定一个 Long 值,当达到此大小时强制触发交换临时文件,默认值为 8MB| + +**Schema 合并规则** + +读取多个 TsFile 时,系统会在确定目标表后,合并该表的 Schema,并将合并后的 Schema 作为本次查询的输出 Schema,且仅用于本次查询,不会注册到数据库元数据中。其合并规则如下: + +- tag 列按顺序合并。存在冲突时要求前缀一致;同一位置 tag 名称不同时报错;允许后续位置追加 tag 列。 + +- time 列名称必须一致,存在冲突时报错。 + +- field 列对顺序无要求,不同文件可以包含不同 field 列,系统会进行增量合并;同名 field 列的数据类型必须兼容,否则报错。 + +- 不同 TsFile 中同名列的列类型必须一致,否则报错。 + +**返回结果** + +- 返回指定表的数据结果集。 + +- 输出列来自外部 TsFile 中目标表的合并 Schema。 + +- `time` 列为时间列,列名取决于 TsFile 中记录的时间列名称。 + +- tag 列表示设备标识信息。 + +- field 列表示实际测点数据。 + +### 4.4 使用示例 + +假设在`/data/backup/` 路径下有文件 `1.tsfile`, 该文件中的元数据和数据可参考 [示例数据](../Reference/Sample-Data.md) 中的 `table1` + +1. 自动推断表名读取 TsFile。 + +该场景要求 `/data/backup/1.tsfile` 中有且只有一个表。 + +```sql +SELECT * +FROM TABLE( + read_tsfile( + PATHS => '/data/backup/1.tsfile' + ) +) +LIMIT 10; +``` + +返回结果 + +```text ++-----------------------------+------+--------+---------+--------+-----------+-----------+--------+------+-----------------------------+ +| time|region|plant_id|device_id|model_id|maintenance|temperature|humidity|status| arrival_time| ++-----------------------------+------+--------+---------+--------+-----------+-----------+--------+------+-----------------------------+ +|2024-11-29T10:00:00.000+08:00| 上海| 3001| 101| D| 360| 85.0| null| null|2024-11-29T10:00:13.000+08:00| +|2024-11-29T11:00:00.000+08:00| 上海| 3002| 100| E| 180| null| 45.1| true| null| +|2024-11-29T18:30:00.000+08:00| 上海| 3002| 100| E| 180| 90.0| 35.4| true|2024-11-29T18:30:15.000+08:00| +|2024-11-30T09:30:00.000+08:00| 上海| 3002| 101| F| 360| 90.0| 35.2| true| null| +|2024-11-30T14:30:00.000+08:00| 上海| 3002| 101| F| 360| 90.0| 34.8| true|2024-11-30T14:30:17.000+08:00| +|2024-11-26T13:37:00.000+08:00| 北京| 1001| 100| A| 180| 90.0| 35.1| true|2024-11-26T13:37:34.000+08:00| +|2024-11-26T13:38:00.000+08:00| 北京| 1001| 100| A| 180| 90.0| 35.1| true|2024-11-26T13:38:25.000+08:00| +|2024-11-28T08:00:00.000+08:00| 上海| 3001| 100| C| 90| 85.0| null| null|2024-11-28T08:00:09.000+08:00| +|2024-11-28T09:00:00.000+08:00| 上海| 3001| 100| C| 90| null| 40.9| true| null| +|2024-11-28T10:00:00.000+08:00| 上海| 3001| 100| C| 90| 85.0| 35.2| null|2024-11-28T10:00:11.000+08:00| ++-----------------------------+------+--------+---------+--------+-----------+-----------+--------+------+-----------------------------+ +Total line number = 10 +It costs 0.159s +``` + +2. 读取目录下的 TsFile。 + +```sql +SELECT time, device_id, temperature +FROM TABLE( + read_tsfile( + TABLE_NAME => 'table1', + PATHS => '/data/backup' + ) +) +WHERE time >= 2024-11-28 00:00:00 AND time < 2024-11-29 00:00:00 ; +``` + +返回结果 + +```text ++-----------------------------+---------+-----------+ +| time|device_id|temperature| ++-----------------------------+---------+-----------+ +|2024-11-28T08:00:00.000+08:00| 100| 85.0| +|2024-11-28T09:00:00.000+08:00| 100| null| +|2024-11-28T10:00:00.000+08:00| 100| 85.0| +|2024-11-28T11:00:00.000+08:00| 100| 88.0| ++-----------------------------+---------+-----------+ +Total line number = 4 +It costs 0.116s +``` + +3. 按 tag 聚合。 + +```sql +SELECT device_id, count(temperature) +FROM TABLE( + read_tsfile( + TABLE_NAME => 'table1', + PATHS => '/data/backup' + ) +) +GROUP BY device_id; +``` + +返回结果 + +```text ++---------+-----+ +|device_id|_col1| ++---------+-----+ +| 100| 6| +| 101| 6| ++---------+-----+ +Total line number = 2 +It costs 0.049s +``` + +## 5. 时间序列趋势匹配表值函数 + +### 5.1 功能描述 + +`pattern_match` 表值函数支持基于输入的模式(pattern)序列,在指定的历史时间序列中,查找并返回所有符合阈值、结果边界等预设判定条件的子序列。 + +> V2.0.12 版本起支持 + +### 5.2 函数定义 + +```sql +pattern_match( + data => {table_name | subquery} PARTITION BY partition_col ORDER BY time_col, + [time_col => 'time_column_name',] + data_col => 'data_column_name', + pattern => 'pattern_sequence', + smooth => numeric_value, + threshold => numeric_value, + [width => numeric_value,] + [height => numeric_value,] + [smooth_on_pattern => {true | false}] +) +``` + +### 5.3 参数说明 + +|参数|类型|必填|默认值|说明| +|---|---|---|---|---| +|`data`|表名/子查询
|是|-|时间序列所在的表名或子查询结果,**必须保证时间列有序**;支持 `PARTITION BY` 按字段分区、`ORDER BY` 按时间排序| +|`time_col`|字符串|否|`'time'`|时间列名称,**仅支持时间戳类型**| +|`data_col`|字符串|是|-|序列名称,支持的数据类型:int、long、double、float| +|`pattern`|字符串|是|-|匹配模式序列,格式为数值列表(支持普通趋势序列 + 正则规则):
1. 基础格式:以逗号分隔的整型 / 浮点型数值(如 '1.0,2.0,3.0');
2. 正则扩展:支持 `{数值段}+`(至少 1 次重复)、`{数值段}*`(至少 0 次重复),其中 `{`,` }* `,`}+` 为独立单位;
3. 特殊规则:每个段的最左侧点与上一个段共用| +|`smooth`|非负实数|是||数据波动容忍幅度(平滑程度):
1. 数值越大,容忍的波动越大,但易过度平滑正常数据;
2. 推荐值:值域的 1%,可根据序列特性调整| +|`threshold`|非负实数|是||相似度阈值:仅返回相似度小于该值的结果,数值越小匹配越精确;建议从 1 开始向上调整| +|`width`|非负实数|否|无限大|匹配结果的宽度限制:仅返回长度(时间戳差值)小于该值的子序列| +|`height`|非负实数|否|无限大|匹配结果的高度限制:仅返回高度小于该值的子序列| +|`smooth_on_pattern`|布尔值
|否|`false`|是否对 pattern 做平滑处理:
1. false:pattern 为形状趋势,仅对原始序列做平滑;
2. true:对 pattern 和原始序列做同等平滑降噪| + +**返回结果** + +输出结果中仅保留与 pattern 匹配的数据段对应的行,且输出行按 `match_index` 升序排列。未匹配的行全部丢弃。 + +|列名|类型|说明| +|---|---|---| +|`match_index`|int32|非负整数,表示匹配到的第 N 个符合 pattern 的数据段| +|`similarity`|double|非负实数,表示该数据段与 pattern 的匹配相似度(值越小,匹配越精确)| +|data 参数所有列|与原列一致|包含输入 `data` 参数中所有列的原始数据| + +### 5.4 使用示例 + +以下示例演示普通模板匹配、参数调整、正则模板匹配以及平滑处理。 + +#### 5.4.1 准备测试数据 + +创建表并写入数据: + +```sql +create table test(value DOUBLE FIELD, value1 DOUBLE FIELD); +INSERT INTO test VALUES (1, 1, 0),(2, 2, 0),(3, 1, 0),(4, 1, 0),(5, 1, 0),(6, 1.2, 0),(7, 1, 0),(8, 1, 0),(9, 2, 0),(10, 3, 0),(11, 4, 0),(12, 3, 0),(13, 2, 0),(14, 3, 0),(15, 4, 0),(16, 2, 0),(17, 1, 0),(18, 1, 0),(19, 1, 0),(20, 1, 0),(21, 1, 0),(41, 1, 0),(42, 2, 0),(43, 3, 0),(44, 4, 0),(45, 3, 0),(46, 2, 0),(47, 2, 0),(48, 2, 0),(49, 2, 0),(50, 2, 0),(51, 2, 0),(52, 2, 0); +``` + +可通过如下语句查询数据: + +```sql +select * from test; +``` + +图示效果如下: + +![](/img/featured-function-01.png) + +#### 5.4.2 基础趋势匹配 + +使用普通序列作为模板,查找数据中趋势相似的子序列。 + +```sql +select * from pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,2.0,3.0,2.0,1.0,1.0,1.0,1.0,1.0', + smooth => 0.5, + threshold => 10.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern=> false +); +``` + +图示效果 + +![](/img/featured-function-02.png) + +查询返回 3 组趋势匹配结果。相似度越小,表示匹配程度越高。 + +```text ++-----------+------------------+-----------------------------+-----+------+ +|match_index| similarity| time|value|value1| ++-----------+------------------+-----------------------------+-----+------+ +| 0| 4.637180787192477|1970-01-01T08:00:00.001+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.002+08:00| 2.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.003+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.004+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.005+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.006+08:00| 1.2| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.007+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.008+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.013+08:00| 2.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.014+08:00| 3.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.015+08:00| 4.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.016+08:00| 2.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.017+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.018+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.019+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.020+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.021+08:00| 1.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.041+08:00| 1.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.042+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.043+08:00| 3.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.044+08:00| 4.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.045+08:00| 3.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.046+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.047+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.048+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.049+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.050+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.051+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.052+08:00| 2.0| 0.0| ++-----------+------------------+-----------------------------+-----+------+ +Total line number = 29 +It costs 0.126s +``` + +#### 5.4.3 调整匹配条件 + +以下示例均以 7.4.2 的基础查询为准,仅修改对应参数。 + +|调整目的|参数|基础值|调整值|调整效果| +|---|---|---|---|---| +|提高匹配精度|`threshold`|`10.0`|`1.0`|仅保留相似度小于 `1.0` 的结果,匹配结果由 3 组减少为 2 组| +|限制匹配时间跨度|`width`|`1000.0`|`10.0`|仅返回时间跨度小于 `10.0` 的子序列| +|限制数值波动范围|`height`|`500.0`|`2.0`|仅返回数值波动范围小于 `2.0` 的子序列| + +#### 5.4.4 正则模板匹配 + +正则模板可以用于匹配重复出现的趋势片段。 + +|重复符号|含义| +|---|---| +|`+`|前面的子序列至少出现 1 次| +|`*`|前面的子序列可以出现 0 次或多次| + +以下示例使用 `+` 匹配至少出现一次的子序列 `2.0,3.0,2.0`: + +```sql +select * from pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,{2.0,3.0,2.0}+,1.0,1.0,1.0,1.0,1.0', + smooth => 0.5, + threshold => 100.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern => false +); +``` + +如果允许子序列 `2.0,3.0,2.0` 出现零次或多次,可以将 `+` 修改为 `*`: + +```sql +pattern => '1.0,{2.0,3.0,2.0}*,1.0,1.0,1.0,1.0,1.0' +``` + +正则模板适用于周期性波动、重复峰值以及长度不固定的趋势匹配场景。 + +#### 5.4.5 模板平滑处理 + +当模板序列包含小幅波动时,可以通过 `smooth_on_pattern` 控制是否对模板序列进行平滑处理。 + +以下示例展示两种不同参数配置下的匹配结果: + +|配置|`threshold`|`smooth_on_pattern`|匹配效果| +|---|---|---|---| +|同时平滑原始序列和模板序列|`1.0`|`true`|可以匹配原始数据中的 `1.0,1.2,1.0` 波动片段| +|仅平滑原始序列|`10.0`|`false`|仍可返回其他趋势匹配结果,但不包含对应的 `1.0,1.2,1.0` 波动片段| + +同时平滑原始序列和模板序列: + +```sql +SELECT * +FROM pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,1.2,1.0', + smooth => 0.5, + threshold => 1.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern => true +); +``` + +在该配置下,原始序列和模板序列采用相同的平滑规则,可以匹配包含时间点 5、6、7 对应的 `1.0,1.2,1.0` 波动片段。 + +图示效果如下: + +![](/img/featured-function-03.png) + +仅平滑原始序列: + +```sql +SELECT * +FROM pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,1.2,1.0', + smooth => 0.5, + threshold => 10.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern => false +); +``` + +在该配置下,仅对原始序列进行平滑处理。查询仍可返回其他趋势匹配结果,但时间点 5、6、7 对应的 `1.0,1.2,1.0` 波动片段未被匹配。 + +图示效果如下: + +![](/img/featured-function-04.png) + +## 6. 频域分析函数 + +### 6.1 FFT + +#### 6.1.1 功能概述 + +表模型内置表值函数 `FFT` 用于对输入表各分区内的一个或多个实值数值序列执行一维快速傅里叶变换。输入数据必须通过 `ORDER BY` 指定时间列并按升序排列,也可通过 `PARTITION BY` 按设备或 Tag 进行分组。每个分区独立生成一组频率 bin,同一分区内的多个数值列共享该频率轴。 + +> V2.0.12 版本起支持 + +#### 6.1.2 函数定义 + +- 命名参数语法如下: + +```sql +SELECT * +FROM FFT( + DATA => {table_name | subquery} + [PARTITION BY partition_column [, ...]] + ORDER BY time_column, + [SAMPLE_INTERVAL => duration_literal,] + [N => positive_integer,] + [NORM => {'backward' | 'forward' | 'ortho'},] + [TIMECOL => 'time_column'] +); +``` + +- 位置参数语法如下: + +```sql +SELECT * +FROM TABLE( + FFT( + TABLE(table_name) + [PARTITION BY partition_column [, ...]] + ORDER BY time_column + [, duration_literal + [, positive_integer + [, norm + [, time_column_name]]]] + ) +); +``` + +参数的规范顺序为 `DATA, SAMPLE_INTERVAL, N, NORM, TIMECOL`。推荐使用**命名参数**,以提高复杂调用的可读性。 + +#### 6.1.3 参数说明 + +|参数|是否必填|类型|默认值|说明| +|---|---|---|---|---| +|`DATA`|是|表参数|无|指定 FFT 的输入数据。可以使用 `PARTITION BY` 分区,每个分区独立计算;省略时,全部数据作为一个分区。除时间列和分区列外,所有 `INT32`、`INT64`、`FLOAT` 和 `DOUBLE` 列均参与计算,其他类型的列自动忽略。输入中至少需要一个数值列,且参与计算的列不能包含 `NULL`。如需只计算部分数值列,可在输入子查询中提前选择。| +|`SAMPLE_INTERVAL`|否|正数时间间隔字面量|根据时间列推断|指定采样间隔,例如 `1ms`、`10ms` 或 `1s`,用于计算频率轴。未指定时,每个分区按照 `(最后一个时间戳 - 第一个时间戳) / (输入行数 - 1)` 推断。单行分区无法自动推断,必须显式指定;空分区直接返回 0 行。| +|`N`|否|正整数|当前分区的输入行数|指定 FFT 变换长度。小于输入行数时,使用按时间排序后的前 `N` 行;大于输入行数时,在序列尾部补 0。每个分区输出 `N` 行结果。`N` 最大为 `65536`,且需满足 `N × 2 × 参与计算的数值列数 ≤ 16777216`。| +|`NORM`|否|字符串|`backward`|指定 FFT 结果的归一化方式,大小写不敏感。`backward`:不进行归一化;`forward`:将结果除以变换长度 `N`;`ortho`:将结果除以 `√N`。| +|`TIMECOL`|否|字符串|`time`|指定时间列名称,对应列必须为 `TIMESTAMP` 类型。`DATA` 必须仅按照该列升序排列,不支持 `DESC`;每个分区内的时间戳必须严格递增,不允许重复。| + +- FFT 通常适用于等间隔采样的数据。本函数不会自动检测或修正不等间隔的数据。为确保频谱结果准确,请在计算前对数据进行插值或重采样;如果采样间隔已知,建议通过 `SAMPLE_INTERVAL` 显式指定。 + +- 当 `N` 小于输入行数时,函数仍会检查分区内的全部输入数据,但只使用前 `N` 行进行 FFT 计算。 + +**返回结果** + +`FFT` 返回每个分区的完整双边频谱,输出列顺序如下: + +```text +分区列... +frequency_index +frequency +<数值列名>_real +<数值列名>_imag +... +``` + +|输出列|类型|说明| +|---|---|---| +|`PARTITION BY` 指定的列|与输入类型一致|保留原列名和类型,位于结果集最前面。未使用 `PARTITION BY` 时不输出。| +|`frequency_index`|`INT64`|频率点索引,范围为 `0` 至 `N-1`。| +|`frequency`|`DOUBLE`|当前频率点对应的频率,单位为 Hz。| +|`<数值列名>_real`|`DOUBLE`|对应输入数值列的 FFT 实部。| +|`<数值列名>_imag`|`DOUBLE`|对应输入数值列的 FFT 虚部。| + +对于变换长度 `N` 和采样间隔 `d`(单位为秒),`frequency` 的计算方式如下: + +|**frequency_index 范围**|**frequency**| +|---|---| +|`frequency_index < ceil(N / 2)`|`frequency_index / (N × d)`| +|其他情况|`(frequency_index - N) / (N × d)`| + +频率按照零频率、正频率、负频率的顺序排列,单位为 Hz。同一分区内,所有数值列共享相同的频率轴。 + +#### 6.1.4 注意事项 + +- `FFT` 函数名不区分大小写。每个分区独立执行一维 FFT。 + +- 当前版本仅支持实数输入,不支持复数输入、`DFT` 或 `IFFT`。 + +- 当前版本仅输出完整频谱的实部和虚部,不支持单边频谱、振幅或相位输出。 + +- 当前版本不支持 `VALUE`、`SAMPLE_RATE` 和 `SPECTRUM` 参数。 + +#### 6.1.5 使用示例 + +以下示例直接使用 `table1` 中的数据。由于 `temperature` 包含 `NULL`,需要在输入子查询中提前过滤。 + +- 示例 1:按设备执行 FFT + +```sql +SELECT * +FROM FFT( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE plant_id = '1001' + AND temperature IS NOT NULL + ) PARTITION BY device_id ORDER BY time +) +ORDER BY device_id, frequency_index; +``` + +函数分别对每个设备的 `temperature` 执行 FFT。未指定 `N` 和 `SAMPLE_INTERVAL` 时,函数根据各分区的输入行数确定变换长度,并根据时间列推断采样间隔。本例中的采样间隔为 1 分钟。 + +```text ++---------+---------------+---------------------+----------------------+---------------------+ +|device_id|frequency_index| frequency| temperature_real| temperature_imag| ++---------+---------------+---------------------+----------------------+---------------------+ +| 100| 0| 0.0| 180.0| 0.0| +| 100| 1|-0.008333333333333333| 0.0| 0.0| +| 101| 0| 0.0| 255.0| -6.67572021484375E-6| +| 101| 1| 0.005555555555555556|-4.6126147026370745E-6|-5.266308107820805E-6| +| 101| 2|-0.005555555555555556| -1.9073486328125E-6| 3.303624680484063E-6| ++---------+---------------+---------------------+----------------------+---------------------+ +``` + +- 示例 2:指定变换长度和归一化方式 + +```sql +SELECT * +FROM FFT( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE plant_id = '1001' + AND temperature IS NOT NULL + ) PARTITION BY device_id ORDER BY time, + SAMPLE_INTERVAL => 1m, + N => 4, + NORM => 'ortho' +) +ORDER BY device_id, frequency_index; +``` + +函数将每个设备的变换长度设置为 4。输入数据不足 4 行时,在数值序列尾部补 0;FFT 结果按照 `1/√N` 进行归一化。每个设备均返回 4 行频谱结果。 + +```text ++---------+---------------+---------------------+----------------------+----------------+ +|device_id|frequency_index| frequency| temperature_real|temperature_imag| ++---------+---------------+---------------------+----------------------+----------------+ +| 100| 0| 0.0| 90.0| 0.0| +| 100| 1| 0.004166666666666667| 45.0| -45.0| +| 100| 2|-0.008333333333333333| 0.0| 0.0| +| 100| 3|-0.004166666666666667| 45.0| 45.0| +| 101| 0| 0.0| 127.5| 0.0| +| 101| 1| 0.004166666666666667| 2.602374475716698E-15| -42.5| +| 101| 2|-0.008333333333333333| 42.5| 0.0| +| 101| 3|-0.004166666666666667|-2.602374475716698E-15| 42.5| ++---------+---------------+---------------------+----------------------+----------------+ +``` + +- 示例 3:数值列包含 `NULL` + +```sql +SELECT * +FROM FFT( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE plant_id = '1001' + ) PARTITION BY device_id ORDER BY time +); +``` + +由于参与 FFT 计算的数值列不能包含 `NULL`,查询执行失败: + +```text +Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: FFT does not support null values in column [temperature]. +``` + +可以在输入子查询中使用 `IS NOT NULL` 过滤空值后再执行 FFT。 + +### 6.2 lowPass + +#### 6.2.1 功能描述 + +`lowPass` 是低通滤波函数,对输入表中的数值列执行频域滤波,保留低频成分并衰减高频成分,适用于信号平滑和高频噪声去除。参数 `wpass` 为归一化通带频率,取值范围为 `(0, 1)`,用于指定允许通过的频率上限。 + +> V2.0.12 版本起支持 + +#### 6.2.2 函数定义 + +- 命名参数语法如下: + +```sql +SELECT * +FROM lowPass( + DATA => input_table PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column', + WPASS => passband_frequency +); +``` + +- 位置参数语法如下: + +```sql +SELECT * +FROM lowPass( + input_table PARTITION BY partition_column ORDER BY time_column, + 'time_column', + passband_frequency +); +``` + +#### 6.2.3 参数说明 + +|参数|类型|必填|说明| +|---|---|---|---| +|`DATA`|表参数(`SET SEMANTIC`)|是|输入表或子查询。`ORDER BY` 必须仅指定时间列并按**升序**排列;`PARTITION BY` 可选,不指定时整张表作为一个分区。| +|`TIMECOL`|字符串|是|时间列名称,必须为时间戳类型,且只能指定一个时间列。| +|`WPASS`|`DOUBLE`|是|归一化通带频率,取值范围为 `(0, 1)`;低于该频率的成分保留,高于该频率的成分衰减。| + +**计算规则** + +- `TIMECOL` 和 `PARTITION BY` 指定的列不参与计算,但会保留在输出中。 + +- 除时间列和分区列外,仅 `INT32`、`INT64`、`FLOAT`、`DOUBLE` 列参与计算;不存在可计算列或存在其他类型列时,分析阶段报错。 + +- 参与计算列中的 `NULL` 值不参与该列的滤波计算。 + +**返回结果** + +- 输出分区列(如指定)和时间列,列名及类型保持不变。 + +- 每个参与计算的数值列输出一个滤波结果列,类型统一为 `DOUBLE`。每个结果列的测点数与对应输入列一致,结果按时间戳升序输出。 + +#### 6.2.4 使用示例 + +以下示例直接使用 `table1` 中的数据。 + +```sql +SELECT * +FROM lowPass( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE temperature is not null + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + WPASS => 0.3 +); +``` + +该示例按设备分区,对 temperature 列执行低通滤波,输出 `device_id`、`time` 以及滤波后的数值列。 + +```text ++---------+-----------------------------+--------------------+ +|device_id| time|lowpass(temperature)| ++---------+-----------------------------+--------------------+ +| 100|2024-11-26T13:37:00.000+08:00| 88.0| +| 100|2024-11-26T13:38:00.000+08:00| 88.0| +| 100|2024-11-28T08:00:00.000+08:00| 87.99999999999999| +| 100|2024-11-28T10:00:00.000+08:00| 87.99999999999999| +| 100|2024-11-28T11:00:00.000+08:00| 88.00000000000001| +| 100|2024-11-29T18:30:00.000+08:00| 88.0| +| 101|2024-11-27T16:39:00.000+08:00| 86.66666666666667| +| 101|2024-11-27T16:40:00.000+08:00| 86.66666666666667| +| 101|2024-11-27T16:41:00.000+08:00| 86.66666666666664| +| 101|2024-11-29T10:00:00.000+08:00| 86.66666666666664| +| 101|2024-11-30T09:30:00.000+08:00| 86.66666666666667| +| 101|2024-11-30T14:30:00.000+08:00| 86.66666666666664| ++---------+-----------------------------+--------------------+ +``` + +### 6.3 highPass + +#### 6.3.1 功能描述 + +`highPass` 是高通滤波函数,对输入表中的数值列执行频域滤波,保留高频成分并衰减低频成分,适用于提取快速变化、跳变和高频噪声等信号成分。参数 `wpass` 为归一化通带频率,取值范围为 `(0, 1)`,用于指定允许通过的频率下限。 + +> V2.0.12 版本起支持 + +#### 6.3.2 函数定义 + +- 命名参数语法如下: + +```sql +SELECT * +FROM highPass( + DATA => input_table PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column', + WPASS => passband_frequency +); +``` + +- 位置参数语法如下: + +```sql +SELECT * +FROM highPass( + input_table PARTITION BY partition_column ORDER BY time_column, + 'time_column', + passband_frequency +); +``` + +#### 6.3.3 参数说明 + +|参数|类型|必填|说明| +|---|---|---|---| +|`DATA`|表参数(`SET SEMANTIC`)|是|输入表或子查询。`ORDER BY` 必须仅指定时间列并按升序排列;`PARTITION BY` 可选,不指定时整张表作为一个分区。| +|`TIMECOL`|字符串|是|时间列名称,必须为时间戳类型,且只能指定一个时间列。| +|`WPASS`|`DOUBLE`|是|归一化通带频率,取值范围为 `(0, 1)`;高于该频率的成分保留,低于该频率的成分衰减。| + +**输入列和计算规则** + +- `TIMECOL` 和 `PARTITION BY` 指定的列不参与计算,但会保留在输出中。 + +- 除时间列和分区列外,仅 `INT32`、`INT64`、`FLOAT`、`DOUBLE` 列参与计算;不存在可计算列或存在其他类型列时,分析阶段报错。 + +- 参与计算列中的 `NULL` 值不参与该列的滤波计算。 + +**返回结果** + +- 输出分区列(如指定)和时间列,列名及类型保持不变。 + +- 每个参与计算的数值列输出一个滤波结果列,类型统一为 `DOUBLE`。每个结果列的测点数与对应输入列一致,结果按时间戳升序输出。 + +#### 6.3.4 使用示例 + +```sql +SELECT * +FROM highPass( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE temperature is not null + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + WPASS => 0.3 +); +``` + +该示例按设备分区,对 temperature 列执行高通滤波,输出 `device_id`、`time` 以及滤波后的数值列。 + +```text ++---------+-----------------------------+----------------------+ +|device_id| time| highpass(temperature)| ++---------+-----------------------------+----------------------+ +| 100|2024-11-26T13:37:00.000+08:00| 2.000000000000029| +| 100|2024-11-26T13:38:00.000+08:00| 2.000000000000004| +| 100|2024-11-28T08:00:00.000+08:00| -2.9999999999999702| +| 100|2024-11-28T10:00:00.000+08:00| -3.000000000000013| +| 100|2024-11-28T11:00:00.000+08:00|-4.182831670630972E-14| +| 100|2024-11-29T18:30:00.000+08:00| 1.9999999999999953| +| 101|2024-11-27T16:39:00.000+08:00| -1.666666666666642| +| 101|2024-11-27T16:40:00.000+08:00| -1.6666666666666519| +| 101|2024-11-27T16:41:00.000+08:00| -1.666666666666645| +| 101|2024-11-29T10:00:00.000+08:00| -1.666666666666701| +| 101|2024-11-30T09:30:00.000+08:00| 3.3333333333333015| +| 101|2024-11-30T14:30:00.000+08:00| 3.333333333333338| ++---------+-----------------------------+----------------------+ +``` + +## 7. 时序相关性分析函数 + +### 7.1 Xcorr + +#### 7.1.1 功能描述 + +`Xcorr` 是相关性分析函数,对输入的两列数值序列进行互相关分析,度量两条序列在不同时间滞后(`lag`)下的形状相似度。函数将一条序列逐步平移,与另一条序列逐点相乘并求和,输出相似度曲线,可用于发现两路信号之间的延迟关系和相似模式。 + +> V2.0.12 版本起支持 + +#### 7.1.2 函数定义 + +- 命名参数语法如下: + +```sql +SELECT * +FROM Xcorr( + DATA => ( + SELECT time_column, signal_1, signal_2, partition_column + FROM input_table + ) PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column' +); +``` + +- 位置参数语法如下: + +```sql +SELECT * +FROM Xcorr( + ( SELECT time_column, signal_1, signal_2, partition_column + FROM input_table + ) PARTITION BY partition_column ORDER BY time_column, + 'time_column' +); +``` + +#### 7.1.3 参数说明 + +|参数|类型|必填|说明| +|---|---|---|---| +|`DATA`|表参数(`SET SEMANTIC`)|是|输入表或子查询。`ORDER BY` 必须指定时间列并按升序排列;`PARTITION BY` 可选。去除时间列和分区列后,必须恰好剩余两列数值列。| +|`TIMECOL`|字符串|是|时间列名称,必须为时间戳类型,且只能指定一个时间列。| + +**计算规则** + +- 时间列和分区列不参与互相关计算。 + +- 去除上述列后,必须恰好存在两列,且两列类型均为 `INT32`、`INT64`、`FLOAT` 或 `DOUBLE`;否则分析阶段报错。 + +- 参与计算的两列中出现 `NULL` 时,该位置按 `0` 参与计算。 + +- 每个分区内时间列必须严格升序。 + +- 计算时按函数定义进行归一化处理。 + +**返回结果** + +- 输出 `PARTITION BY` 指定的分区列(如指定),列名及类型保持不变。 + +- 对参与计算的两列,生成一个结果列,类型为double。 + +#### 7.1.4 使用示例 + +以下示例使用 SQL 手册示例数据中的 `table1`,并通过子查询投影两列数值序列 `temperature` 和 `humidity` 参与互相关计算。 + +```sql +SELECT * +FROM Xcorr( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE temperature IS NOT NULL + AND humidity IS NOT NULL + ) + PARTITION BY device_id + ORDER BY time, + TIMECOL => 'time' +); +``` + +该示例按设备分区,对 temperature 和 humidity 两列进行互相关分析,输出 `device_id` 以及相关性分析结果列。 + +```text ++---------+----------------------------+ +|device_id|xcorr(temperature, humidity)| ++---------+----------------------------+ +| 100| 3186.0001373291016| +| 100| 3622.5| +| 100| 3412.0000203450522| +| 100| 3318.9249839782715| +| 100| 3292.9599586486815| +| 100| 3324.7749156951904| +| 100| 3080.0999348958335| +| 100| 3123.8998641967773| +| 100| 3158.9998626708984| +| 101| 2957.9999351501465| +| 101| 3061.9999980926514| +| 101| 3100.166645050049| +| 101| 3172.5| +| 101| 3176.999931335449| ++---------+----------------------------+ +``` diff --git a/src/zh/UserGuide/latest-Table/SQL-Manual/Featured-Functions_apache.md b/src/zh/UserGuide/latest-Table/SQL-Manual/Featured-Functions_apache.md index 20abca659..105c30828 100644 --- a/src/zh/UserGuide/latest-Table/SQL-Manual/Featured-Functions_apache.md +++ b/src/zh/UserGuide/latest-Table/SQL-Manual/Featured-Functions_apache.md @@ -213,6 +213,213 @@ GROUP BY 1, device_id; +---------+---------+--------+ ``` +### 1.3 `M4` 函数 + +#### 1.3.1 功能描述 + +`M4` 是表模型内置的多态表值函数,用于对时序数据进行降采样。函数在每个窗口内提取首点(First)、尾点(Last)、最小值点(Bottom)和最大值点(Top),在减少返回数据量的同时尽量保持趋势图形状。与标量函数或聚合函数不同,`M4` 接收一个表参数并返回结果表,必须在 `FROM` 子句中调用。 + +- 首点:窗口内时间戳最小且值不为 `NULL` 的点。 + +- 尾点:窗口内时间戳最大且值不为 `NULL` 的点。 + +- 最小值点和最大值点:窗口内值最小或最大的点;值相同时保留按输入扫描顺序遇到的第一个点。 + +- 支持时间窗口和点数窗口两种模式。`SIZE` 使用时间长度字面量(例如 `1h`、`10m`)时为时间窗口;使用正整数(例如 `100`)时为点数窗口。 + +> V2.0.12 版本起支持 + +#### 1.3.2 函数定义 + +```sql +SELECT * +FROM M4( + DATA => input_table PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column', + [ORIGIN => origin_timestamp,] + SIZE => window_duration | window_point_count, + [SLIDE => window_duration | window_point_count] +); +``` + +`DATA` 是集合语义表参数。使用时必须指定 `ORDER BY`,且排序列只能是 `TIMECOL` 指定的时间列并按升序排列;`PARTITION BY` 可选,不指定时整张输入表作为一个分区处理。参数可按名称或按声明顺序传递,建议使用命名参数。 + +#### 1.3.3 参数说明 + +|参数|类型|必填|说明| +|---|---|---|---| +|`DATA`|表参数(SET SEMANTIC)|是|输入表或子查询。可指定 `PARTITION BY` 和 `ORDER BY`。| +|`TIMECOL`|字符串|是|时间列名。该列必须为 `TIMESTAMP` 类型,且 `ORDER BY` 只能包含该列。| +|`ORIGIN`|时间戳|否|时间窗口的对齐原点,默认值为 `0`。点数窗口模式不使用该参数。| +|`SIZE`|时间长度或 `INT64`|是|时间窗口的窗口长度,或点数窗口的点数大小;必须为正数。| +|`SLIDE`|与 `SIZE` 同类型|否|窗口滑动步长,默认与 `SIZE` 相同。必须与 `SIZE` 使用相同窗口模式。| + +**计算规则** + +- `TIMECOL` 指定列不参与 M4 计算。 + +- `PARTITION BY` 指定列不参与计算,但保留在输出结果中。 + +- 除上述列外,所有可比较类型列均参与 M4 计算。 + +- 排除上述列后,若无可比较类型列,或存在不可比较类型列,分析阶段直接报错。 + +- 参与列值为 `NULL` 的记录,不参与该列的 `first`、`last`、`bottom`、`top` 计算。 + +- 各参与列先计算并去重 `first`、`last`、`bottom`、`top` 特征点,再按时间戳升序输出。 + +**返回结果** + +- 时间窗口模式:固定生成 `window_start`、`window_end`(时间戳类型),表示窗口范围 `[window_start, window_end)`。 + +- 点数窗口模式:固定生成 `window_index`(长整数类型),表示窗口序号;在每个 `PARTITION BY` 分区内独立计算,从 `0` 开始递增。 + +- PARTITION BY 列:按原列名、原类型保留输出,多个列按声明顺序排列。`OBJECT` 类型不支持作为分区列;`BLOB` 类型可保留输出,但不参与 M4 计算。 + +- 动态生成列:每个参与 M4 计算的列 `c` 生成 `c_time`(特征点时间戳)和 `c`(特征点值)两列,类型与输入列保持一致。多列结果按输入列顺序展开。 + +补充说明:窗口输出行数取所有参与列特征点数量的最大值。特征点较少的列,其剩余行的 `c_time` 和 `c` 填充 `NULL`。 + +#### 1.3.4 使用示例 + +以下示例均使用[示例数据](../Reference/Sample-Data.md)中的 `table1`。由于 `table1` 中除时间列和分区列外还包含其他字段,因此示例通过子查询仅选择 `time`、`device_id`、`temperature` 和 `humidity` 参与 M4 计算。 + +- 示例 1:时间窗口模式 + +以 `device_id = '101'` 的数据为例,每 3 分钟划分一个窗口。`SIZE => 3m` 表示使用时间窗口模式,窗口长度为 3 分钟。窗口采用半开区间 `[window_start, window_end)`,每个窗口分别提取 `temperature` 和 `humidity` 列的首点、尾点、最小值点和最大值点,并按照特征点时间戳升序输出。 + +```sql +SELECT window_start, + window_end, + device_id, + temperature_time, + temperature, + humidity_time, + humidity +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + AND time >= 2024-11-27 16:38:00 + AND time <= 2024-11-27 16:44:00 + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + SIZE => 3m +); +``` + +结果: + +```text ++-----------------------------+-----------------------------+---------+-----------------------------+-----------+-----------------------------+--------+ +| window_start| window_end|device_id| temperature_time|temperature| humidity_time|humidity| ++-----------------------------+-----------------------------+---------+-----------------------------+-----------+-----------------------------+--------+ +|2024-11-27T16:36:00.000+08:00|2024-11-27T16:39:00.000+08:00| 101| null| null|2024-11-27T16:38:00.000+08:00| 35.1| +|2024-11-27T16:39:00.000+08:00|2024-11-27T16:42:00.000+08:00| 101|2024-11-27T16:39:00.000+08:00| 85.0|2024-11-27T16:39:00.000+08:00| 35.3| +|2024-11-27T16:39:00.000+08:00|2024-11-27T16:42:00.000+08:00| 101|2024-11-27T16:41:00.000+08:00| 85.0| null| null| +|2024-11-27T16:42:00.000+08:00|2024-11-27T16:45:00.000+08:00| 101| null| null|2024-11-27T16:42:00.000+08:00| 35.2| ++-----------------------------+-----------------------------+---------+-----------------------------+-----------+-----------------------------+--------+ +``` + +- 示例 2:点数窗口模式 + +以 `device_id = '101'` 的数据为例,每 3 个数据点划分一个窗口。`SIZE => 3` 表示使用点数窗口模式,每 3 行数据划分一个窗口。窗口序号通过 `window_index` 标识,并在每个分区内从 `0` 开始计算。 + +```sql +SELECT window_index, + device_id, + temperature_time, + temperature, + humidity_time, + humidity +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + AND time >= 2024-11-27 16:38:00 + AND time <= 2024-11-27 16:44:00 + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + SIZE => 3 +); +``` + +结果: + +```text ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +|window_index|device_id| temperature_time|temperature| humidity_time|humidity| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +| 0| 101|2024-11-27T16:39:00.000+08:00| 85.0|2024-11-27T16:38:00.000+08:00| 35.1| +| 0| 101|2024-11-27T16:40:00.000+08:00| 85.0|2024-11-27T16:39:00.000+08:00| 35.3| +| 1| 101|2024-11-27T16:41:00.000+08:00| 85.0|2024-11-27T16:42:00.000+08:00| 35.2| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +``` + +如果需要设置窗口滑动步长,可以同时指定 `SLIDE`: + +```sql +SELECT window_index, + device_id, + temperature_time, + temperature, + humidity_time, + humidity +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + AND time >= 2024-11-27 16:38:00 + AND time <= 2024-11-27 16:44:00 + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + SIZE => 3, + SLIDE => 2 +); +``` + +上述调用表示窗口大小为 3 个数据点,窗口每次向后滑动 2 个数据点。 + +结果: + +```text ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +|window_index|device_id| temperature_time|temperature| humidity_time|humidity| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +| 0| 101|2024-11-27T16:39:00.000+08:00| 85.0|2024-11-27T16:38:00.000+08:00| 35.1| +| 0| 101|2024-11-27T16:40:00.000+08:00| 85.0|2024-11-27T16:39:00.000+08:00| 35.3| +| 1| 101|2024-11-27T16:40:00.000+08:00| 85.0|2024-11-27T16:42:00.000+08:00| 35.2| +| 1| 101|2024-11-27T16:41:00.000+08:00| 85.0| null| null| +| 2| 101| null| null|2024-11-27T16:42:00.000+08:00| 35.2| ++------------+---------+-----------------------------+-----------+-----------------------------+--------+ +``` + +- 示例 3:非法示例——`ORDER BY` 未指定时间列 + +`M4` 要求 `DATA` 参数必须指定 `ORDER BY`,且排序列必须与 `TIMECOL` 参数指定的时间列一致。下面的示例错误地使用 `temperature` 作为排序列: + +```sql +SELECT * +FROM M4( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE device_id = '101' + ) PARTITION BY device_id ORDER BY temperature, + TIMECOL => 'time', + SIZE => 3m +); +``` + +报错: + +```text +Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: The ORDER BY clause of the DATA argument must contain exactly the time column specified by the TIMECOL argument. +``` + ## 2. DIFF函数 ### 2.1 功能概述 @@ -522,27 +729,51 @@ IoTDB> SELECT first(time) as window_start, last(time) as window_end, stock_id, a #### 3.4.1 功能描述 -CAPACITY 函数用于按数据点数(行数)分窗,每个窗口最多有 SIZE 行数据。 +CAPACITY 函数用于按数据点数(行数)分窗,每个窗口最多有 SIZE 行数据。自 V2.0.12 起支持通过参数 SLIDE 指定相邻窗口起点之间间隔的行数。 #### 3.4.2 函数定义 ```sql -CAPACITY(data [PARTITION BY(pkeys, ...)] [ORDER BY(okeys, ...)], size) +CAPACITY( + DATA => + [PARTITION BY [, ...]] + [ORDER BY [, ...]], + SIZE => + [, SLIDE => ] +) ``` #### 3.4.3 参数说明 -| 参数名 | 参数类型 | 参数属性 | 描述 | -| -------- | ---------- | -------------------------- | ---------------------------------------- | -| DATA | 表参数 | SET SEMANTICPASS THROUGH | 输入表通过 pkeys、okeys 指定分区和排序 | -| SIZE | 标量参数 | 长整数类型 | 窗口大小 | +|参数|类型|是否必填|说明| +|---|---|---|---| +|DATA|Table|是|输入表或子查询,支持 PARTITION BY 和 ORDER BY,透传输入列。| +|SIZE|INT64 Scalar|是|窗口容量,必须为正数,表示单个窗口最多覆盖的行数。| +|SLIDE|INT64 Scalar|否|窗口滑动步长,显式传入时必须为正数;省略时默认等于 SIZE。| + +- 指定 PARTITION BY 时,每个分区独立从 0 开始计算行号和窗口编号; + +- 指定 ORDER BY 时,按排序结果确定行号顺序。 + +- 窗口编号从 0 开始,第 k 个窗口覆盖的行号范围为 `[k * SLIDE, k * SLIDE + SIZE)`。 + +- 不同参数关系对应的窗口行为如下: + +|参数关系|窗口类型|行为| +|---|---|---| +|`SLIDE < SIZE`|重叠窗口|相邻窗口有重叠,同一输入行可能属于多个窗口,并以不同的 `window_index` 输出多行。| +|`SLIDE = SIZE`|非重叠窗口|相邻窗口首尾相接,行为与历史版本的 CAPACITY(DATA => ..., SIZE => n) 一致。| +|`SLIDE > SIZE`|间隔窗口|相邻窗口之间存在空档,落在空档内的输入行不输出。| #### 3.4.4 返回结果 CAPACITY 函数的返回结果列包含: -* window\_index: 窗口编号 -* 映射列:DATA 参数的所有输入列 +- window_index: 窗口编号,为 INT64 类型,从 0 开始。 + +- DATA 参数透传列:保持输入表对应列的名称和类型。 + +返回结果可直接查询,也可继续基于 window_index 和业务分组列进行聚合。 #### 3.4.5 使用示例 @@ -569,6 +800,23 @@ IoTDB> SELECT first(time) as start_time, last(time) as end_time, stock_id, avg(p |2021-01-01T09:05:00.000+08:00|2021-01-01T09:07:00.000+08:00| AAPL|101.5| |2021-01-01T09:09:00.000+08:00|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +-----------------------------+-----------------------------+--------+-----+ + +-- 使用 SLIDE 参数生成重叠窗口(SLIDE < SIZE) +IoTDB> SELECT * FROM CAPACITY(DATA => bid PARTITION BY stock_id ORDER BY time, SIZE => 2, SLIDE => 1); ++------------+-----------------------------+--------+-----+ +|window_index| time|stock_id|price| ++------------+-----------------------------+--------+-----+ +| 0|2021-01-01T09:05:00.000+08:00| AAPL|100.0| +| 0|2021-01-01T09:07:00.000+08:00| AAPL|103.0| +| 1|2021-01-01T09:07:00.000+08:00| AAPL|103.0| +| 1|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +| 2|2021-01-01T09:09:00.000+08:00| AAPL|102.0| +| 0|2021-01-01T09:06:00.000+08:00| TESL|200.0| +| 0|2021-01-01T09:07:00.000+08:00| TESL|202.0| +| 1|2021-01-01T09:07:00.000+08:00| TESL|202.0| +| 1|2021-01-01T09:15:00.000+08:00| TESL|195.0| +| 2|2021-01-01T09:15:00.000+08:00| TESL|195.0| ++------------+-----------------------------+--------+-----+ ``` ### 3.5 TUMBLE @@ -695,3 +943,856 @@ IoTDB> SELECT window_start, window_end, stock_id, avg(price) as avg FROM CUMULAT +-----------------------------+-----------------------------+--------+------------------+ ``` + +## 4. `read_tsfile` 表值函数 + +### 4.1 功能概述 + +用于从外部 TsFile 文件或目录读取表模型数据。`read_tsfile` 返回一个临时表数据源,查询时可像普通表一样使用 `SELECT`、`WHERE`、`ORDER BY`、`LIMIT`、`OFFSET`、聚合等能力,对外部 TsFile 数据进行只读分析和临时处理,不会将处理结果写回外部 TsFile,也不会修改 IoTDB 内部数据,不支持通过该入口写入、删除、修改或注册外部 TsFile。 + +> V2.0.12 版本起支持 + +### 4.2 函数定义 + +```sql +SELECT * +FROM TABLE( + read_tsfile( + TABLE_NAME => '', + PATHS => '' + ) +); +``` + +### 4.3 参数说明 + +|参数|必填|说明| +|---|---|---| +|`PATHS`|是|TsFile 文件路径或目录路径。单路径直接传入字符串;多路径在同一个字符串中使用英文逗号分隔,例如 `'/data/a.tsfile,/data/b.tsfile,/data/history'`。
- 指定文件时,系统会直接尝试打开该文件;
- 指定目录时,系统会递归遍历目录下以 `.tsfile` 为后缀的文件,并根据文件首尾的 MAGIC NUMBER 识别有效 TsFile。文件内容不符合 TsFile 格式、无法识别、不完整或版本不是 TsFile V4 的文件不参与本次查询。
注意:指定的路径必须对执行查询的 DataNode 进程可见,并且 DataNode 进程需要具备相应的文件读取权限。禁止指定 DataNode 的任意数据目录,否则查询会报错。| +|`TABLE_NAME`|否|需要读取的表名。填写该参数时,系统只读取包含目标表 Schema 的有效文件;如果所有有效文件中都不存在目标表 Schema,查询报错。
当外部 TsFile 中可以唯一推断出待读取的表名时,可以省略该参数;省略时要求每个参与读取的有效文件中都有且只有一个表,并且所有有效文件推断出的表名一致。如果某个有效文件包含多个表,或者不同有效文件中的唯一表名不一致,查询报错。| +|`DEVICE_METADATA_INFO_SWAP_THRESHOLD` |否|查询时如果文件数和设备数量都很多,为了避免占用过多内存可能会将一些信息写成交换文件,这个参数可指定一个 Long 值,当达到此大小时强制触发交换临时文件,默认值为 8MB| + +**Schema 合并规则** + +读取多个 TsFile 时,系统会在确定目标表后,合并该表的 Schema,并将合并后的 Schema 作为本次查询的输出 Schema,且仅用于本次查询,不会注册到数据库元数据中。其合并规则如下: + +- tag 列按顺序合并。存在冲突时要求前缀一致;同一位置 tag 名称不同时报错;允许后续位置追加 tag 列。 + +- time 列名称必须一致,存在冲突时报错。 + +- field 列对顺序无要求,不同文件可以包含不同 field 列,系统会进行增量合并;同名 field 列的数据类型必须兼容,否则报错。 + +- 不同 TsFile 中同名列的列类型必须一致,否则报错。 + +**返回结果** + +- 返回指定表的数据结果集。 + +- 输出列来自外部 TsFile 中目标表的合并 Schema。 + +- `time` 列为时间列,列名取决于 TsFile 中记录的时间列名称。 + +- tag 列表示设备标识信息。 + +- field 列表示实际测点数据。 + +### 4.4 使用示例 + +假设在`/data/backup/` 路径下有文件 `1.tsfile`, 该文件中的元数据和数据可参考 [示例数据](../Reference/Sample-Data.md) 中的 `table1` + +1. 自动推断表名读取 TsFile。 + +该场景要求 `/data/backup/1.tsfile` 中有且只有一个表。 + +```sql +SELECT * +FROM TABLE( + read_tsfile( + PATHS => '/data/backup/1.tsfile' + ) +) +LIMIT 10; +``` + +返回结果 + +```text ++-----------------------------+------+--------+---------+--------+-----------+-----------+--------+------+-----------------------------+ +| time|region|plant_id|device_id|model_id|maintenance|temperature|humidity|status| arrival_time| ++-----------------------------+------+--------+---------+--------+-----------+-----------+--------+------+-----------------------------+ +|2024-11-29T10:00:00.000+08:00| 上海| 3001| 101| D| 360| 85.0| null| null|2024-11-29T10:00:13.000+08:00| +|2024-11-29T11:00:00.000+08:00| 上海| 3002| 100| E| 180| null| 45.1| true| null| +|2024-11-29T18:30:00.000+08:00| 上海| 3002| 100| E| 180| 90.0| 35.4| true|2024-11-29T18:30:15.000+08:00| +|2024-11-30T09:30:00.000+08:00| 上海| 3002| 101| F| 360| 90.0| 35.2| true| null| +|2024-11-30T14:30:00.000+08:00| 上海| 3002| 101| F| 360| 90.0| 34.8| true|2024-11-30T14:30:17.000+08:00| +|2024-11-26T13:37:00.000+08:00| 北京| 1001| 100| A| 180| 90.0| 35.1| true|2024-11-26T13:37:34.000+08:00| +|2024-11-26T13:38:00.000+08:00| 北京| 1001| 100| A| 180| 90.0| 35.1| true|2024-11-26T13:38:25.000+08:00| +|2024-11-28T08:00:00.000+08:00| 上海| 3001| 100| C| 90| 85.0| null| null|2024-11-28T08:00:09.000+08:00| +|2024-11-28T09:00:00.000+08:00| 上海| 3001| 100| C| 90| null| 40.9| true| null| +|2024-11-28T10:00:00.000+08:00| 上海| 3001| 100| C| 90| 85.0| 35.2| null|2024-11-28T10:00:11.000+08:00| ++-----------------------------+------+--------+---------+--------+-----------+-----------+--------+------+-----------------------------+ +Total line number = 10 +It costs 0.159s +``` + +2. 读取目录下的 TsFile。 + +```sql +SELECT time, device_id, temperature +FROM TABLE( + read_tsfile( + TABLE_NAME => 'table1', + PATHS => '/data/backup' + ) +) +WHERE time >= 2024-11-28 00:00:00 AND time < 2024-11-29 00:00:00 ; +``` + +返回结果 + +```text ++-----------------------------+---------+-----------+ +| time|device_id|temperature| ++-----------------------------+---------+-----------+ +|2024-11-28T08:00:00.000+08:00| 100| 85.0| +|2024-11-28T09:00:00.000+08:00| 100| null| +|2024-11-28T10:00:00.000+08:00| 100| 85.0| +|2024-11-28T11:00:00.000+08:00| 100| 88.0| ++-----------------------------+---------+-----------+ +Total line number = 4 +It costs 0.116s +``` + +3. 按 tag 聚合。 + +```sql +SELECT device_id, count(temperature) +FROM TABLE( + read_tsfile( + TABLE_NAME => 'table1', + PATHS => '/data/backup' + ) +) +GROUP BY device_id; +``` + +返回结果 + +```text ++---------+-----+ +|device_id|_col1| ++---------+-----+ +| 100| 6| +| 101| 6| ++---------+-----+ +Total line number = 2 +It costs 0.049s +``` + +## 5. 时间序列趋势匹配表值函数 + +### 5.1 功能描述 + +`pattern_match` 表值函数支持基于输入的模式(pattern)序列,在指定的历史时间序列中,查找并返回所有符合阈值、结果边界等预设判定条件的子序列。 + +> V2.0.12 版本起支持 + +### 5.2 函数定义 + +```sql +pattern_match( + data => {table_name | subquery} PARTITION BY partition_col ORDER BY time_col, + [time_col => 'time_column_name',] + data_col => 'data_column_name', + pattern => 'pattern_sequence', + smooth => numeric_value, + threshold => numeric_value, + [width => numeric_value,] + [height => numeric_value,] + [smooth_on_pattern => {true | false}] +) +``` + +### 5.3 参数说明 + +|参数|类型|必填|默认值|说明| +|---|---|---|---|---| +|`data`|表名/子查询
|是|-|时间序列所在的表名或子查询结果,**必须保证时间列有序**;支持 `PARTITION BY` 按字段分区、`ORDER BY` 按时间排序| +|`time_col`|字符串|否|`'time'`|时间列名称,**仅支持时间戳类型**| +|`data_col`|字符串|是|-|序列名称,支持的数据类型:int、long、double、float| +|`pattern`|字符串|是|-|匹配模式序列,格式为数值列表(支持普通趋势序列 + 正则规则):
1. 基础格式:以逗号分隔的整型 / 浮点型数值(如 '1.0,2.0,3.0');
2. 正则扩展:支持 `{数值段}+`(至少 1 次重复)、`{数值段}*`(至少 0 次重复),其中 `{`,` }* `,`}+` 为独立单位;
3. 特殊规则:每个段的最左侧点与上一个段共用| +|`smooth`|非负实数|是||数据波动容忍幅度(平滑程度):
1. 数值越大,容忍的波动越大,但易过度平滑正常数据;
2. 推荐值:值域的 1%,可根据序列特性调整| +|`threshold`|非负实数|是||相似度阈值:仅返回相似度小于该值的结果,数值越小匹配越精确;建议从 1 开始向上调整| +|`width`|非负实数|否|无限大|匹配结果的宽度限制:仅返回长度(时间戳差值)小于该值的子序列| +|`height`|非负实数|否|无限大|匹配结果的高度限制:仅返回高度小于该值的子序列| +|`smooth_on_pattern`|布尔值
|否|`false`|是否对 pattern 做平滑处理:
1. false:pattern 为形状趋势,仅对原始序列做平滑;
2. true:对 pattern 和原始序列做同等平滑降噪| + +**返回结果** + +输出结果中仅保留与 pattern 匹配的数据段对应的行,且输出行按 `match_index` 升序排列。未匹配的行全部丢弃。 + +|列名|类型|说明| +|---|---|---| +|`match_index`|int32|非负整数,表示匹配到的第 N 个符合 pattern 的数据段| +|`similarity`|double|非负实数,表示该数据段与 pattern 的匹配相似度(值越小,匹配越精确)| +|data 参数所有列|与原列一致|包含输入 `data` 参数中所有列的原始数据| + +### 5.4 使用示例 + +以下示例演示普通模板匹配、参数调整、正则模板匹配以及平滑处理。 + +#### 5.4.1 准备测试数据 + +创建表并写入数据: + +```sql +create table test(value DOUBLE FIELD, value1 DOUBLE FIELD); +INSERT INTO test VALUES (1, 1, 0),(2, 2, 0),(3, 1, 0),(4, 1, 0),(5, 1, 0),(6, 1.2, 0),(7, 1, 0),(8, 1, 0),(9, 2, 0),(10, 3, 0),(11, 4, 0),(12, 3, 0),(13, 2, 0),(14, 3, 0),(15, 4, 0),(16, 2, 0),(17, 1, 0),(18, 1, 0),(19, 1, 0),(20, 1, 0),(21, 1, 0),(41, 1, 0),(42, 2, 0),(43, 3, 0),(44, 4, 0),(45, 3, 0),(46, 2, 0),(47, 2, 0),(48, 2, 0),(49, 2, 0),(50, 2, 0),(51, 2, 0),(52, 2, 0); +``` + +可通过如下语句查询数据: + +```sql +select * from test; +``` + +图示效果如下: + +![](/img/featured-function-01.png) + +#### 5.4.2 基础趋势匹配 + +使用普通序列作为模板,查找数据中趋势相似的子序列。 + +```sql +select * from pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,2.0,3.0,2.0,1.0,1.0,1.0,1.0,1.0', + smooth => 0.5, + threshold => 10.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern=> false +); +``` + +图示效果 + +![](/img/featured-function-02.png) + +查询返回 3 组趋势匹配结果。相似度越小,表示匹配程度越高。 + +```text ++-----------+------------------+-----------------------------+-----+------+ +|match_index| similarity| time|value|value1| ++-----------+------------------+-----------------------------+-----+------+ +| 0| 4.637180787192477|1970-01-01T08:00:00.001+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.002+08:00| 2.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.003+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.004+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.005+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.006+08:00| 1.2| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.007+08:00| 1.0| 0.0| +| 0| 4.637180787192477|1970-01-01T08:00:00.008+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.013+08:00| 2.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.014+08:00| 3.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.015+08:00| 4.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.016+08:00| 2.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.017+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.018+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.019+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.020+08:00| 1.0| 0.0| +| 1|0.6465473220616865|1970-01-01T08:00:00.021+08:00| 1.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.041+08:00| 1.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.042+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.043+08:00| 3.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.044+08:00| 4.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.045+08:00| 3.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.046+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.047+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.048+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.049+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.050+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.051+08:00| 2.0| 0.0| +| 2| 0.679768727042932|1970-01-01T08:00:00.052+08:00| 2.0| 0.0| ++-----------+------------------+-----------------------------+-----+------+ +Total line number = 29 +It costs 0.126s +``` + +#### 5.4.3 调整匹配条件 + +以下示例均以 7.4.2 的基础查询为准,仅修改对应参数。 + +|调整目的|参数|基础值|调整值|调整效果| +|---|---|---|---|---| +|提高匹配精度|`threshold`|`10.0`|`1.0`|仅保留相似度小于 `1.0` 的结果,匹配结果由 3 组减少为 2 组| +|限制匹配时间跨度|`width`|`1000.0`|`10.0`|仅返回时间跨度小于 `10.0` 的子序列| +|限制数值波动范围|`height`|`500.0`|`2.0`|仅返回数值波动范围小于 `2.0` 的子序列| + +#### 5.4.4 正则模板匹配 + +正则模板可以用于匹配重复出现的趋势片段。 + +|重复符号|含义| +|---|---| +|`+`|前面的子序列至少出现 1 次| +|`*`|前面的子序列可以出现 0 次或多次| + +以下示例使用 `+` 匹配至少出现一次的子序列 `2.0,3.0,2.0`: + +```sql +select * from pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,{2.0,3.0,2.0}+,1.0,1.0,1.0,1.0,1.0', + smooth => 0.5, + threshold => 100.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern => false +); +``` + +如果允许子序列 `2.0,3.0,2.0` 出现零次或多次,可以将 `+` 修改为 `*`: + +```sql +pattern => '1.0,{2.0,3.0,2.0}*,1.0,1.0,1.0,1.0,1.0' +``` + +正则模板适用于周期性波动、重复峰值以及长度不固定的趋势匹配场景。 + +#### 5.4.5 模板平滑处理 + +当模板序列包含小幅波动时,可以通过 `smooth_on_pattern` 控制是否对模板序列进行平滑处理。 + +以下示例展示两种不同参数配置下的匹配结果: + +|配置|`threshold`|`smooth_on_pattern`|匹配效果| +|---|---|---|---| +|同时平滑原始序列和模板序列|`1.0`|`true`|可以匹配原始数据中的 `1.0,1.2,1.0` 波动片段| +|仅平滑原始序列|`10.0`|`false`|仍可返回其他趋势匹配结果,但不包含对应的 `1.0,1.2,1.0` 波动片段| + +同时平滑原始序列和模板序列: + +```sql +SELECT * +FROM pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,1.2,1.0', + smooth => 0.5, + threshold => 1.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern => true +); +``` + +在该配置下,原始序列和模板序列采用相同的平滑规则,可以匹配包含时间点 5、6、7 对应的 `1.0,1.2,1.0` 波动片段。 + +图示效果如下: + +![](/img/featured-function-03.png) + +仅平滑原始序列: + +```sql +SELECT * +FROM pattern_match( + data => test ORDER BY time, + time_col => 'time', + data_col => 'value', + pattern => '1.0,1.2,1.0', + smooth => 0.5, + threshold => 10.0, + width => 1000.0, + height => 500.0, + smooth_on_pattern => false +); +``` + +在该配置下,仅对原始序列进行平滑处理。查询仍可返回其他趋势匹配结果,但时间点 5、6、7 对应的 `1.0,1.2,1.0` 波动片段未被匹配。 + +图示效果如下: + +![](/img/featured-function-04.png) + +## 6. 频域分析函数 + +### 6.1 FFT + +#### 6.1.1 功能概述 + +表模型内置表值函数 `FFT` 用于对输入表各分区内的一个或多个实值数值序列执行一维快速傅里叶变换。输入数据必须通过 `ORDER BY` 指定时间列并按升序排列,也可通过 `PARTITION BY` 按设备或 Tag 进行分组。每个分区独立生成一组频率 bin,同一分区内的多个数值列共享该频率轴。 + +> V2.0.12 版本起支持 + +#### 6.1.2 函数定义 + +- 命名参数语法如下: + +```sql +SELECT * +FROM FFT( + DATA => {table_name | subquery} + [PARTITION BY partition_column [, ...]] + ORDER BY time_column, + [SAMPLE_INTERVAL => duration_literal,] + [N => positive_integer,] + [NORM => {'backward' | 'forward' | 'ortho'},] + [TIMECOL => 'time_column'] +); +``` + +- 位置参数语法如下: + +```sql +SELECT * +FROM TABLE( + FFT( + TABLE(table_name) + [PARTITION BY partition_column [, ...]] + ORDER BY time_column + [, duration_literal + [, positive_integer + [, norm + [, time_column_name]]]] + ) +); +``` + +参数的规范顺序为 `DATA, SAMPLE_INTERVAL, N, NORM, TIMECOL`。推荐使用**命名参数**,以提高复杂调用的可读性。 + +#### 6.1.3 参数说明 + +|参数|是否必填|类型|默认值|说明| +|---|---|---|---|---| +|`DATA`|是|表参数|无|指定 FFT 的输入数据。可以使用 `PARTITION BY` 分区,每个分区独立计算;省略时,全部数据作为一个分区。除时间列和分区列外,所有 `INT32`、`INT64`、`FLOAT` 和 `DOUBLE` 列均参与计算,其他类型的列自动忽略。输入中至少需要一个数值列,且参与计算的列不能包含 `NULL`。如需只计算部分数值列,可在输入子查询中提前选择。| +|`SAMPLE_INTERVAL`|否|正数时间间隔字面量|根据时间列推断|指定采样间隔,例如 `1ms`、`10ms` 或 `1s`,用于计算频率轴。未指定时,每个分区按照 `(最后一个时间戳 - 第一个时间戳) / (输入行数 - 1)` 推断。单行分区无法自动推断,必须显式指定;空分区直接返回 0 行。| +|`N`|否|正整数|当前分区的输入行数|指定 FFT 变换长度。小于输入行数时,使用按时间排序后的前 `N` 行;大于输入行数时,在序列尾部补 0。每个分区输出 `N` 行结果。`N` 最大为 `65536`,且需满足 `N × 2 × 参与计算的数值列数 ≤ 16777216`。| +|`NORM`|否|字符串|`backward`|指定 FFT 结果的归一化方式,大小写不敏感。`backward`:不进行归一化;`forward`:将结果除以变换长度 `N`;`ortho`:将结果除以 `√N`。| +|`TIMECOL`|否|字符串|`time`|指定时间列名称,对应列必须为 `TIMESTAMP` 类型。`DATA` 必须仅按照该列升序排列,不支持 `DESC`;每个分区内的时间戳必须严格递增,不允许重复。| + +- FFT 通常适用于等间隔采样的数据。本函数不会自动检测或修正不等间隔的数据。为确保频谱结果准确,请在计算前对数据进行插值或重采样;如果采样间隔已知,建议通过 `SAMPLE_INTERVAL` 显式指定。 + +- 当 `N` 小于输入行数时,函数仍会检查分区内的全部输入数据,但只使用前 `N` 行进行 FFT 计算。 + +**返回结果** + +`FFT` 返回每个分区的完整双边频谱,输出列顺序如下: + +```text +分区列... +frequency_index +frequency +<数值列名>_real +<数值列名>_imag +... +``` + +|输出列|类型|说明| +|---|---|---| +|`PARTITION BY` 指定的列|与输入类型一致|保留原列名和类型,位于结果集最前面。未使用 `PARTITION BY` 时不输出。| +|`frequency_index`|`INT64`|频率点索引,范围为 `0` 至 `N-1`。| +|`frequency`|`DOUBLE`|当前频率点对应的频率,单位为 Hz。| +|`<数值列名>_real`|`DOUBLE`|对应输入数值列的 FFT 实部。| +|`<数值列名>_imag`|`DOUBLE`|对应输入数值列的 FFT 虚部。| + +对于变换长度 `N` 和采样间隔 `d`(单位为秒),`frequency` 的计算方式如下: + +|**frequency_index 范围**|**frequency**| +|---|---| +|`frequency_index < ceil(N / 2)`|`frequency_index / (N × d)`| +|其他情况|`(frequency_index - N) / (N × d)`| + +频率按照零频率、正频率、负频率的顺序排列,单位为 Hz。同一分区内,所有数值列共享相同的频率轴。 + +#### 6.1.4 注意事项 + +- `FFT` 函数名不区分大小写。每个分区独立执行一维 FFT。 + +- 当前版本仅支持实数输入,不支持复数输入、`DFT` 或 `IFFT`。 + +- 当前版本仅输出完整频谱的实部和虚部,不支持单边频谱、振幅或相位输出。 + +- 当前版本不支持 `VALUE`、`SAMPLE_RATE` 和 `SPECTRUM` 参数。 + +#### 6.1.5 使用示例 + +以下示例直接使用 `table1` 中的数据。由于 `temperature` 包含 `NULL`,需要在输入子查询中提前过滤。 + +- 示例 1:按设备执行 FFT + +```sql +SELECT * +FROM FFT( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE plant_id = '1001' + AND temperature IS NOT NULL + ) PARTITION BY device_id ORDER BY time +) +ORDER BY device_id, frequency_index; +``` + +函数分别对每个设备的 `temperature` 执行 FFT。未指定 `N` 和 `SAMPLE_INTERVAL` 时,函数根据各分区的输入行数确定变换长度,并根据时间列推断采样间隔。本例中的采样间隔为 1 分钟。 + +```text ++---------+---------------+---------------------+----------------------+---------------------+ +|device_id|frequency_index| frequency| temperature_real| temperature_imag| ++---------+---------------+---------------------+----------------------+---------------------+ +| 100| 0| 0.0| 180.0| 0.0| +| 100| 1|-0.008333333333333333| 0.0| 0.0| +| 101| 0| 0.0| 255.0| -6.67572021484375E-6| +| 101| 1| 0.005555555555555556|-4.6126147026370745E-6|-5.266308107820805E-6| +| 101| 2|-0.005555555555555556| -1.9073486328125E-6| 3.303624680484063E-6| ++---------+---------------+---------------------+----------------------+---------------------+ +``` + +- 示例 2:指定变换长度和归一化方式 + +```sql +SELECT * +FROM FFT( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE plant_id = '1001' + AND temperature IS NOT NULL + ) PARTITION BY device_id ORDER BY time, + SAMPLE_INTERVAL => 1m, + N => 4, + NORM => 'ortho' +) +ORDER BY device_id, frequency_index; +``` + +函数将每个设备的变换长度设置为 4。输入数据不足 4 行时,在数值序列尾部补 0;FFT 结果按照 `1/√N` 进行归一化。每个设备均返回 4 行频谱结果。 + +```text ++---------+---------------+---------------------+----------------------+----------------+ +|device_id|frequency_index| frequency| temperature_real|temperature_imag| ++---------+---------------+---------------------+----------------------+----------------+ +| 100| 0| 0.0| 90.0| 0.0| +| 100| 1| 0.004166666666666667| 45.0| -45.0| +| 100| 2|-0.008333333333333333| 0.0| 0.0| +| 100| 3|-0.004166666666666667| 45.0| 45.0| +| 101| 0| 0.0| 127.5| 0.0| +| 101| 1| 0.004166666666666667| 2.602374475716698E-15| -42.5| +| 101| 2|-0.008333333333333333| 42.5| 0.0| +| 101| 3|-0.004166666666666667|-2.602374475716698E-15| 42.5| ++---------+---------------+---------------------+----------------------+----------------+ +``` + +- 示例 3:数值列包含 `NULL` + +```sql +SELECT * +FROM FFT( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE plant_id = '1001' + ) PARTITION BY device_id ORDER BY time +); +``` + +由于参与 FFT 计算的数值列不能包含 `NULL`,查询执行失败: + +```text +Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: FFT does not support null values in column [temperature]. +``` + +可以在输入子查询中使用 `IS NOT NULL` 过滤空值后再执行 FFT。 + +### 6.2 lowPass + +#### 6.2.1 功能描述 + +`lowPass` 是低通滤波函数,对输入表中的数值列执行频域滤波,保留低频成分并衰减高频成分,适用于信号平滑和高频噪声去除。参数 `wpass` 为归一化通带频率,取值范围为 `(0, 1)`,用于指定允许通过的频率上限。 + +> V2.0.12 版本起支持 + +#### 6.2.2 函数定义 + +- 命名参数语法如下: + +```sql +SELECT * +FROM lowPass( + DATA => input_table PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column', + WPASS => passband_frequency +); +``` + +- 位置参数语法如下: + +```sql +SELECT * +FROM lowPass( + input_table PARTITION BY partition_column ORDER BY time_column, + 'time_column', + passband_frequency +); +``` + +#### 6.2.3 参数说明 + +|参数|类型|必填|说明| +|---|---|---|---| +|`DATA`|表参数(`SET SEMANTIC`)|是|输入表或子查询。`ORDER BY` 必须仅指定时间列并按**升序**排列;`PARTITION BY` 可选,不指定时整张表作为一个分区。| +|`TIMECOL`|字符串|是|时间列名称,必须为时间戳类型,且只能指定一个时间列。| +|`WPASS`|`DOUBLE`|是|归一化通带频率,取值范围为 `(0, 1)`;低于该频率的成分保留,高于该频率的成分衰减。| + +**计算规则** + +- `TIMECOL` 和 `PARTITION BY` 指定的列不参与计算,但会保留在输出中。 + +- 除时间列和分区列外,仅 `INT32`、`INT64`、`FLOAT`、`DOUBLE` 列参与计算;不存在可计算列或存在其他类型列时,分析阶段报错。 + +- 参与计算列中的 `NULL` 值不参与该列的滤波计算。 + +**返回结果** + +- 输出分区列(如指定)和时间列,列名及类型保持不变。 + +- 每个参与计算的数值列输出一个滤波结果列,类型统一为 `DOUBLE`。每个结果列的测点数与对应输入列一致,结果按时间戳升序输出。 + +#### 6.2.4 使用示例 + +以下示例直接使用 `table1` 中的数据。 + +```sql +SELECT * +FROM lowPass( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE temperature is not null + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + WPASS => 0.3 +); +``` + +该示例按设备分区,对 temperature 列执行低通滤波,输出 `device_id`、`time` 以及滤波后的数值列。 + +```text ++---------+-----------------------------+--------------------+ +|device_id| time|lowpass(temperature)| ++---------+-----------------------------+--------------------+ +| 100|2024-11-26T13:37:00.000+08:00| 88.0| +| 100|2024-11-26T13:38:00.000+08:00| 88.0| +| 100|2024-11-28T08:00:00.000+08:00| 87.99999999999999| +| 100|2024-11-28T10:00:00.000+08:00| 87.99999999999999| +| 100|2024-11-28T11:00:00.000+08:00| 88.00000000000001| +| 100|2024-11-29T18:30:00.000+08:00| 88.0| +| 101|2024-11-27T16:39:00.000+08:00| 86.66666666666667| +| 101|2024-11-27T16:40:00.000+08:00| 86.66666666666667| +| 101|2024-11-27T16:41:00.000+08:00| 86.66666666666664| +| 101|2024-11-29T10:00:00.000+08:00| 86.66666666666664| +| 101|2024-11-30T09:30:00.000+08:00| 86.66666666666667| +| 101|2024-11-30T14:30:00.000+08:00| 86.66666666666664| ++---------+-----------------------------+--------------------+ +``` + +### 6.3 highPass + +#### 6.3.1 功能描述 + +`highPass` 是高通滤波函数,对输入表中的数值列执行频域滤波,保留高频成分并衰减低频成分,适用于提取快速变化、跳变和高频噪声等信号成分。参数 `wpass` 为归一化通带频率,取值范围为 `(0, 1)`,用于指定允许通过的频率下限。 + +> V2.0.12 版本起支持 + +#### 6.3.2 函数定义 + +- 命名参数语法如下: + +```sql +SELECT * +FROM highPass( + DATA => input_table PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column', + WPASS => passband_frequency +); +``` + +- 位置参数语法如下: + +```sql +SELECT * +FROM highPass( + input_table PARTITION BY partition_column ORDER BY time_column, + 'time_column', + passband_frequency +); +``` + +#### 6.3.3 参数说明 + +|参数|类型|必填|说明| +|---|---|---|---| +|`DATA`|表参数(`SET SEMANTIC`)|是|输入表或子查询。`ORDER BY` 必须仅指定时间列并按升序排列;`PARTITION BY` 可选,不指定时整张表作为一个分区。| +|`TIMECOL`|字符串|是|时间列名称,必须为时间戳类型,且只能指定一个时间列。| +|`WPASS`|`DOUBLE`|是|归一化通带频率,取值范围为 `(0, 1)`;高于该频率的成分保留,低于该频率的成分衰减。| + +**输入列和计算规则** + +- `TIMECOL` 和 `PARTITION BY` 指定的列不参与计算,但会保留在输出中。 + +- 除时间列和分区列外,仅 `INT32`、`INT64`、`FLOAT`、`DOUBLE` 列参与计算;不存在可计算列或存在其他类型列时,分析阶段报错。 + +- 参与计算列中的 `NULL` 值不参与该列的滤波计算。 + +**返回结果** + +- 输出分区列(如指定)和时间列,列名及类型保持不变。 + +- 每个参与计算的数值列输出一个滤波结果列,类型统一为 `DOUBLE`。每个结果列的测点数与对应输入列一致,结果按时间戳升序输出。 + +#### 6.3.4 使用示例 + +```sql +SELECT * +FROM highPass( + DATA => ( + SELECT time, device_id, temperature + FROM table1 + WHERE temperature is not null + ) PARTITION BY device_id ORDER BY time, + TIMECOL => 'time', + WPASS => 0.3 +); +``` + +该示例按设备分区,对 temperature 列执行高通滤波,输出 `device_id`、`time` 以及滤波后的数值列。 + +```text ++---------+-----------------------------+----------------------+ +|device_id| time| highpass(temperature)| ++---------+-----------------------------+----------------------+ +| 100|2024-11-26T13:37:00.000+08:00| 2.000000000000029| +| 100|2024-11-26T13:38:00.000+08:00| 2.000000000000004| +| 100|2024-11-28T08:00:00.000+08:00| -2.9999999999999702| +| 100|2024-11-28T10:00:00.000+08:00| -3.000000000000013| +| 100|2024-11-28T11:00:00.000+08:00|-4.182831670630972E-14| +| 100|2024-11-29T18:30:00.000+08:00| 1.9999999999999953| +| 101|2024-11-27T16:39:00.000+08:00| -1.666666666666642| +| 101|2024-11-27T16:40:00.000+08:00| -1.6666666666666519| +| 101|2024-11-27T16:41:00.000+08:00| -1.666666666666645| +| 101|2024-11-29T10:00:00.000+08:00| -1.666666666666701| +| 101|2024-11-30T09:30:00.000+08:00| 3.3333333333333015| +| 101|2024-11-30T14:30:00.000+08:00| 3.333333333333338| ++---------+-----------------------------+----------------------+ +``` + +## 7. 时序相关性分析函数 + +### 7.1 Xcorr + +#### 7.1.1 功能描述 + +`Xcorr` 是相关性分析函数,对输入的两列数值序列进行互相关分析,度量两条序列在不同时间滞后(`lag`)下的形状相似度。函数将一条序列逐步平移,与另一条序列逐点相乘并求和,输出相似度曲线,可用于发现两路信号之间的延迟关系和相似模式。 + +> V2.0.12 版本起支持 + +#### 7.1.2 函数定义 + +- 命名参数语法如下: + +```sql +SELECT * +FROM Xcorr( + DATA => ( + SELECT time_column, signal_1, signal_2, partition_column + FROM input_table + ) PARTITION BY partition_column ORDER BY time_column, + TIMECOL => 'time_column' +); +``` + +- 位置参数语法如下: + +```sql +SELECT * +FROM Xcorr( + ( SELECT time_column, signal_1, signal_2, partition_column + FROM input_table + ) PARTITION BY partition_column ORDER BY time_column, + 'time_column' +); +``` + +#### 7.1.3 参数说明 + +|参数|类型|必填|说明| +|---|---|---|---| +|`DATA`|表参数(`SET SEMANTIC`)|是|输入表或子查询。`ORDER BY` 必须指定时间列并按升序排列;`PARTITION BY` 可选。去除时间列和分区列后,必须恰好剩余两列数值列。| +|`TIMECOL`|字符串|是|时间列名称,必须为时间戳类型,且只能指定一个时间列。| + +**计算规则** + +- 时间列和分区列不参与互相关计算。 + +- 去除上述列后,必须恰好存在两列,且两列类型均为 `INT32`、`INT64`、`FLOAT` 或 `DOUBLE`;否则分析阶段报错。 + +- 参与计算的两列中出现 `NULL` 时,该位置按 `0` 参与计算。 + +- 每个分区内时间列必须严格升序。 + +- 计算时按函数定义进行归一化处理。 + +**返回结果** + +- 输出 `PARTITION BY` 指定的分区列(如指定),列名及类型保持不变。 + +- 对参与计算的两列,生成一个结果列,类型为double。 + +#### 7.1.4 使用示例 + +以下示例使用 SQL 手册示例数据中的 `table1`,并通过子查询投影两列数值序列 `temperature` 和 `humidity` 参与互相关计算。 + +```sql +SELECT * +FROM Xcorr( + DATA => ( + SELECT time, device_id, temperature, humidity + FROM table1 + WHERE temperature IS NOT NULL + AND humidity IS NOT NULL + ) + PARTITION BY device_id + ORDER BY time, + TIMECOL => 'time' +); +``` + +该示例按设备分区,对 temperature 和 humidity 两列进行互相关分析,输出 `device_id` 以及相关性分析结果列。 + +```text ++---------+----------------------------+ +|device_id|xcorr(temperature, humidity)| ++---------+----------------------------+ +| 100| 3186.0001373291016| +| 100| 3622.5| +| 100| 3412.0000203450522| +| 100| 3318.9249839782715| +| 100| 3292.9599586486815| +| 100| 3324.7749156951904| +| 100| 3080.0999348958335| +| 100| 3123.8998641967773| +| 100| 3158.9998626708984| +| 101| 2957.9999351501465| +| 101| 3061.9999980926514| +| 101| 3100.166645050049| +| 101| 3172.5| +| 101| 3176.999931335449| ++---------+----------------------------+ +```