LATEST 関数を使用すると、時系列テーブルの指定された列の最新の N 行のデータを、時系列の最新の時点に基づいてクエリできます。
適用可能なエンジンとバージョン
最新値クエリは、LindormTSDB のすべてのバージョンにのみ適用できます。
構文
select_latest_by_statement ::= SELECT ( select_clause )
FROM table_identifier
WHERE where_clause
SAMPLE BY 0
select_clause ::= selector [ AS identifier ] ( ',' selector [ AS identifier ] )
selector ::= tag_identifier | time | latest '(' field_name [ ',' N ] ')'
where_clause ::= relation ( AND relation )* (OR relation)*
relation ::= ( field_identifier | tag_identifier ) operator term
operator ::= '=' | '<' | '>' | '<=' | '>=' | '!=' | IN 最新値クエリは、OFFSET、LIMIT、GROUP BY などの句と直接使用することはできません。 これらの句を含む SQL ステートメントで、最新値クエリをサブクエリとして使用できます。
パラメーター
セレクター
タグ列(tag_identifier)、タイムスタンプ列(time)、および LATEST 関数の式をセレクターとして指定できます。
LATEST 関数の式は、latest '(' field_name [ ',' N] ')' という形式です。
式では LATEST 関数のみがサポートされています。 LATEST 関数は、RATE、DELTA、MAX、MIN などの他の関数と組み合わせて使用することはできません。 次の表に、LATEST 関数で設定できるパラメーターを示します。
パラメーター | 説明 |
field_name | フィールド列の名前。 |
N | フィールド列でクエリする最新の値の数を指定する整数。 このパラメーターのデフォルト値は 1 で、フィールド列の最新値のみがクエリされることを示します。 |
例
次の例では、サンプルテーブル sensor は、次のステートメントを実行することによって作成されます。
-- テーブルを作成します。
CREATE TABLE sensor (
device_id VARCHAR TAG,
region VARCHAR TAG,
time TIMESTAMP,
temperature DOUBLE,
humidity DOUBLE,
PRIMARY KEY(device_id));
-- テーブルにデータを挿入します。
INSERT INTO sensor (device_id, region, time, temperature, humidity) VALUES
('F07A1260','north-cn','2021-04-22 15:33:00',12.1,45),
('F07A1260','north-cn','2021-04-22 15:33:10',13.2,47),
('F07A1260','north-cn','2021-04-22 15:33:20',10.6,null),
('F07A1260','north-cn','2021-04-22 15:33:30',null,48),
('F07A1260','north-cn','2021-04-22 15:33:20',10.6,46),
('F07A1261','south-cn','2021-04-22 15:33:00',18.1,44),
('F07A1261','south-cn','2021-04-22 15:33:10',19.7,44);上記のステートメントの null 値は、対応する時点ではテーブルにデータが書き込まれていないことを示します。
最新のデータ行をクエリする
F07A1260 デバイスと F07A1261 デバイスの最新の温度値をクエリします。
SELECT device_id,region,time,latest(temperature) AS temperature FROM sensor WHERE device_id in ('F07A1260', 'F07A1261') SAMPLE BY 0;次の結果が返されます。
+-----------+----------+---------------------------+-------------+
| device_id | region | time | temperature |
+-----------+----------+---------------------------+-------------+
| F07A1261 | south-cn | 2021-04-22T15:33:10+08:00 | 19.7 |
| F07A1260 | north-cn | 2021-04-22T15:33:20+08:00 | 10.6 |
+-----------+----------+---------------------------+-------------+最新の N 行のデータをクエリする
F07A1260 デバイスと F07A1261 デバイスの最新の 2 つの温度値をクエリします。
SELECT device_id,region,time,latest(temperature, 2) AS temperature FROM sensor WHERE device_id in ('F07A1260', 'F07A1261') SAMPLE BY 0;次の結果が返されます。
+-----------+----------+---------------------------+-------------+
| device_id | region | time | temperature |
+-----------+----------+---------------------------+-------------+
| F07A1261 | south-cn | 2021-04-22T15:33:10+08:00 | 19.7 |
| F07A1261 | south-cn | 2021-04-22T15:33:00+08:00 | 18.1 |
| F07A1260 | north-cn | 2021-04-22T15:33:20+08:00 | 10.6 |
| F07A1260 | north-cn | 2021-04-22T15:33:10+08:00 | 13.2 |
+-----------+----------+---------------------------+-------------+複数の列の最新値をクエリする
F07A1260 デバイスの複数の列の最新値をクエリします。
SELECT device_id,region,time,latest(temperature) AS temperature, latest(humidity) AS humidity FROM sensor WHERE device_id in ('F07A1260') SAMPLE BY 0;次の結果が返されます。
+-----------+----------+---------------------------+-------------+----------+
| device_id | region | time | temperature | humidity |
+-----------+----------+---------------------------+-------------+----------+
| F07A1260 | north-cn | 2021-04-22T15:33:30+08:00 | null | 48 |
| F07A1260 | north-cn | 2021-04-22T15:33:20+08:00 | 10.6 | null |
+-----------+----------+---------------------------+-------------+----------+複数の列の最新値は、異なる行にある場合があります。 行の他の値は、調整のために null 値で埋められます。
ネストされたクエリを実行する
GROUP BY 句を使用して、F07A1260 デバイスと F07A1261 デバイスの最新の 2 つの温度値の最大値をクエリします。
SELECT device_id, max(temperature) AS max_temperature FROM (SELECT device_id, region,time, latest(temperature,2) AS temperature FROM sensor SAMPLE BY 0) GROUP BY device_id;次の結果が返されます。
+-----------+-----------------+
| device_id | max_temperature |
+-----------+-----------------+
| F07A1261 | 19.7 |
| F07A1260 | 13.2 |
+-----------+-----------------+ページクエリを実行する
F07A1260 デバイスと F07A1261 デバイスの最新の 2 つの温度値をクエリし、LIMIT と OFFSET を 1 に設定して、クエリ結果の 2 行目のデータを返します。
SELECT device_id, region, temperature FROM (SELECT device_id, region, time, latest(temperature,2) AS temperature FROM sensor SAMPLE BY 0) LIMIT 1 OFFSET 1;次の結果が返されます。
+-----------+----------+-------------+
| device_id | region | temperature |
+-----------+----------+-------------+
| F07A1261 | south-cn | 18.1 |
+-----------+----------+-------------+