コンテンツにスキップ

SERIES BY

SERIES BY句はソート済みの結果集合から、特定条件を満たす連続した行の区間(series)を抽出します。連続区間の開始/終了時刻やパターンの分析に使用します。

構文

SELECT ...
  FROM table_name
 [WHERE ...]
 ORDER BY col [ASC | DESC]
 SERIES BY condition_expr
  • ORDER BY句がなければ、_ARRIVAL_TIME列でソートします。
  • GROUP BYを使用する場合や、_ARRIVAL_TIME列がないVOLATILE / LOOKUPテーブルでは、必ずORDER BYを明示してください。
  • SERIES BY条件を連続して満たす同一区間の行は、同じSERIESNUM()値を持ちます。

基本的な使用方法

CREATE LOG TABLE t1 (c1 INTEGER, c2 INTEGER);
INSERT INTO t1 VALUES (0, 1);
INSERT INTO t1 VALUES (1, 2);
INSERT INTO t1 VALUES (2, 3);
INSERT INTO t1 VALUES (3, 2);
INSERT INTO t1 VALUES (4, 1);
INSERT INTO t1 VALUES (5, 2);
INSERT INTO t1 VALUES (6, 3);
INSERT INTO t1 VALUES (7, 1);

SELECT c1, c2
  FROM t1
 ORDER BY c1
 SERIES BY c2 > 1;

結果:

C1          C2
---------------------------
1           2
2           3
3           2
5           2
6           3

SERIESNUM()で区間番号を確認

SELECT c1, c2, SERIESNUM() AS grp
  FROM t1
 ORDER BY c1
 SERIES BY c2 > 1;

結果:

C1          C2          GRP
-----------------------------------
1           2           1
2           3           1
3           2           1
5           2           2
6           3           2

TAGテーブルで連続区間を分析

内側のクエリで連続区間別の番号を生成し、外側のクエリで区間番号を基準に集計します。

-- 100を超える連続区間ごとの開始/終了時刻と最大値を参照
SELECT MIN(time) AS start_time,
       MAX(time) AS end_time,
       MAX(value) AS peak_value,
       series_id
  FROM (
      SELECT time, value, SERIESNUM() AS series_id
        FROM tag
       WHERE name = 'PRESSURE-01'
         AND time >= TO_DATE('2024-01-01', 'YYYY-MM-DD')
       ORDER BY time
       SERIES BY value > 100.0
  )
 GROUP BY series_id
 ORDER BY series_id;

関連ドキュメント

最終更新日