LATEST 関数は、指定されたフィールド列について、時系列ごとに最新の N 個の値を返します。デバイスの現在のステータスを表示したり、センサーの最後の測定値を取得したり、リアルタイムモニタリングダッシュボードを構築したりする際に使用します。
対象エンジンとバージョン
最新値クエリは時系列エンジンにのみ適用され、バージョンの制限はありません。
構文
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 field 句と直接組み合わせることはできません。ただし、サブクエリを使用することで、これらの句と組み合わせて使用できます。
パラメーター
セレクター
タグ列 (tag_identifier)、タイムスタンプ列 (time)、および最新値関数式をセレクターとして設定できます。
最新値関数式 (latest '(' field_name [ ',' N] ')')
LATEST 関数のみがサポートされており、LATEST 関数は RATE、DELTA、MAX、MIN などの他の関数と組み合わせることはできません。LATEST 関数のパラメーターは次のとおりです。
パラメーター
パラメーター | 説明 |
| フィールド列の名前。 |
| 返す最新値の個数を指定する整数。デフォルト: 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 件の温度レコードを照会します。クエリ結果の 2 番目のレコードを返すには、LIMIT (返される行数) と OFFSET (オフセット) を 1 に設定します。
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 |
+-----------+----------+-------------+