メインコンテンツまでスキップ

EQL — イベントクエリ言語ヘルプ

🎬 Read EQL statements · 41초 · 2026.08 기준 화면

目次​


概要​

主な利用場所 左側メニュー 自動化 > EQLクエリ(/query/index) で直接実行し、高度なアラーム ・ トリガー・ステートメント ・ フロー の条件式でも同一構文を使用します。

EQL (Event Query Language) は、PlantPulse PlatformがリアルタイムストリーミングデータをSQL構文のように質疑・集計・パターンマッチングできるように設計した独自クエリ言語です。一般的なSQLが静的テーブルを対象に動作するのに対し、EQLは継続的に流入するイベントストリーム上で動作し、毎瞬の結果をemitします。

オペレーターはEQL一行で以下を実現できます。

  • リアルタイムモニタリング — タグ値が閾値を超えた瞬間に即座に結果をemit
  • 資産単位の集計 — 5分ごとの平均/最大/最小を自動計算
  • パターンマッチング — 「イベントAの後、30秒以内にイベントBが来なければアラーム」
  • 時系列ジョイン — 2つのタグの時間的整合性を比較

EQLはSQLとほぼ同一の構文を使用しますが、ウィンドウ(Window) の概念が追加されており、「直近N秒 / N件」といった時間または長さの範囲を指定します。

使用可能な機能はエンジンの種類によって異なります

このページではコンソールで実行されるすべてのEQLを扱います。ただし、CEPは起動時にバックエンドを1つ選択し、バックエンドごとにサポートされる構成が異なります。ジョイン・変数・コンテキストなど、一方にしか存在しない機能があります。

何がどこで動作するかは CEP — バックエンド の表に記載されており、言語自体の仕様は CEP — EQL言語、拒否トークンについては 限界と拒否トークン を参照してください。

拒否される場合は登録時点で名前が提示されるため、静かにエラーになることはありません。


EQLの利用場所​

Platform内でのEQL利用場所は以下の通りです。

EQLクエリ・ステートメントは左側メニュー 자동화 グループに並んで配置されています。 「CEP」という名前のメニューはありません。

メニュー ・ 画面内部URL用途
自動化 > EQLクエリ — 文書/query/indexオペレーターが即席でEQLを実行して結果を確認 (探索・デバッグ)
トリガー (左側メニューなし) — 文書/trigger/indexEQLマッチング結果をMQトピックまたはストレージに自動発行
自動化 > ステートメント — 文書/statement/index資産単位で登録されたルール (状態/集計/イベント/コマンド)。種類別の 必須出力項目 を入力することで保存されます
アラーム → EQLアラーム—EQLルールによる任意条件のアラーム発行
フロー → スクリプト—flow_script_filter / flow_script_transform / flow_switch のEQL表現式モード
タグ様式 — 人工知能タブ—予測・異常検知ルールの入力条件

EQLは読み取り専用です。データを変更しません。マッチング結果でアラームを発行したり、フロー のアクションノードを呼び出したりするには、CEP → トリガー または EQLアラーム を介して結果を接続してください。


基本構文​

EQLの基本構造はSQLとほぼ同一です。

SELECT <column-or-function>
FROM <stream>.<window>
WHERE <condition>
GROUP BY <field>
HAVING <aggregation-condition>
ORDER BY <field> [ASC|DESC]

最も単純なEQL:

SELECT * FROM Point.win:time(1 sec)

直近 1秒間 に流入したすべてのタグポイントを1秒ごとにemit。

ワイルドカードとカラム選択​

構文意味
SELECT *すべてのカラムを含める
SELECT tag_id, value特定のカラムのみ
SELECT value AS v, tag_id AS id別名(alias)を付与
SELECT value * 9 / 5 + 32 AS fahrenheit算術式の結果
SELECT CASE WHEN value > 80 THEN 'HIGH' ELSE 'OK' END AS level条件式

注釈​

-- 한 줄 주석
/* 여러 줄
주석 */
SELECT * FROM Point.win:time(1 sec)

イベントストリーム (14種 + 内部用3종)​

EQLの FROM 句に指定できるストリーム(イベントソース)は以下の通りです。すべてのストリームはPlatformが自動的に発生させ、別途登録することなく即時に使用可能です。

ここにない名前を FROM に記述すると、ルールが配信されません。 登録済みのイベントタイプのみがストリームとして利用可能です (plantpulse.core.engine.eql.EventTypes)。

タグドメイン (3種)​

ストリーム発生時点主要フィールド
Pointタグ値が受信されるたびtag_id, value, quality, ts, site_id, asset_id, unit, java_type
PointMap同様だが tag('<id>') 関数と共に使用し、複数タグをキー-値として照会(PointMap専用ヘルパー)
Alarmタグアラームが発生したときtag_id, alarm_band, value, threshold, priority, band_message

資産ドメイン (6種)​

ストリーム発生時点主要フィールド
AssetData資産単位の時系列データ (集計結果)asset_id, values(key-value), ts
AssetEvent資産イベント発生 (開始・停止・整備など)asset_id, event_type, details, ts
AssetAlarm資産アラーム発生asset_id, alarm_band, priority, message
AssetCommand資産にコマンドが発行されたときasset_id, command, args
AssetAggregation1分/5分/1時間 資産集計結果asset_id, window, agg_type, values
AssetContext資産コンテキスト(メタ)変更asset_id, context_key, before, after
AssetHealthStatus および AssetConnectionStatus はストリームではありません

旧文書にこれらが資産ドメインストリームとして記載されていましたが、登録済みイベントタイプではありません。 FROM AssetHealthStatus... と記述してもルールは配信されません。

ヘルス・接続状態の評価はストリームではなく、周期実行ジョブとして動作します (AssetHealthStatusDeployer / AssetConnectionStatusDeployer)。その結果は画面とAPIで報告されます。EQLで状態変化を検知したい場合は、ソースである AssetEvent ・ AssetAlarm や Point の未受信を not パターン で検知してください。

生産ドメイン (3種)​

ストリーム発生時点主要フィールド
Calendarシフト開始/終了/変更shift_id, calendar_id, event, start_time, end_time
WorkOrderワークオーダーライフサイクル遷移order_id, status, prev_status, asset_id, product_id
OEEOEE評価結果更新order_id, asset_id, oee, availability, performance, quality

システムドメイン (2종)​

ストリーム発生時点主要フィールド
Logシステム診断メッセージmodule, level, code, summary, ts
OSPerformanceサーバーOSリソース指標 (周期)CPU・メモリ・ディスクなど
Statusストリームは存在しません

Status という名前のイベントタイプは登録されていません。OPC・Edgeの接続状態変化を EQLで検知しようとした場合、そのストリームでは不可能です。Point の未受信を not パターン で検知する方法を使用してください。

内部用ストリーム (3종)​

登録はされていますが、ルール作成用ではありません。診断・ヘルスチェックに使用されます。

ストリーム用途
DateTime周期的に発生する時刻イベント (時間基準ルールのトリガー)
Pingエンジン生存確認
Testルール検証用

すべてのストリームは使用前に必ずウィンドウと結合しなければなりません (Point.win:time(1 sec) のように)。ウィンドウなしで FROM Point のみを記述すると、結果が即座に消失するため見えなくなります。


ウィンドウ​

ウィンドウは「ストリーム上から切り出した時間または長さの区間」です。EQLは2種類のウィンドウをサポートしています。

時間ウィンドウ (Time Window)​

構文意味
Point.win:time(1 sec)直近 1秒 間に流入したすべてのイベント (sliding)
Point.win:time(10 sec)直近 10秒
Point.win:time(5 min)直近 5分
Point.win:time(1 hour)直近 1時間

サポートされる時間単位: sec(秒) ・ min(分) ・ hour(時間) ・ day(日)。

長さウィンドウ (Length Window)​

構文意味
Point.win:length(100)直近 100件 のイベント
Point.win:length(1000)直近 1,000件

バッチウィンドウ (Batch Window)​

win:time_batch / win:length_batch — ウィンドウが満杯になったか、時間が満了した 瞬間にのみ 一度だけemit。リソース消費を削減します。

-- 매 1분마다 한 번씩 그 1분간 평균을 emit
SELECT avg(value) FROM Point.win:time_batch(1 min) WHERE tag_id = 'MOTOR-001.TEMP'

ウィンドウ選択ガイド​

状況推奨ウィンドウ
リアルタイムモニタリング (値そのものを確認)win:time(1 sec)
短期平均/最大 (5分平均など)win:time(5 min)
時間単位の集計win:time_batch(1 hour)
直近N件の比較win:length(N)
変量追跡win:length(2) + prev() 関数

WHERE条件​

SQLと同様の比較演算子を使用します。

演算子例意味
= != <>tag_id = 'MOTOR-001'一致/不一致
< <= > >=value > 80比較
BETWEENvalue BETWEEN 70 AND 90範囲
INtag_id IN ('A','B','C')リスト含有
LIKEtag_id LIKE 'MOTOR-%'パターンマッチング (% ワイルドカード)
IS NULL / IS NOT NULLquality IS NOT NULLnull判定
AND OR NOTvalue > 80 AND quality = 'GOOD'論理結合

正規表現​

SELECT * FROM Point.win:time(1 sec)
WHERE tag_id REGEXP '.*\\.TEMP$'

末尾が .TEMP であるタグのみにマッチ。バックスラッシュは2回 (\\.) 入力してください。

動的サイト/資産フィルタ​

SELECT * FROM Point.win:time(1 sec)
WHERE site_id = 'SITE-A'
AND asset_id LIKE 'LINE-1.%'
AND value > 75

集計関数​

ウィンドウ内のイベントを集計します。

基本集計​

関数意味例
count(*)イベント件数SELECT count(*) FROM Point.win:time(10 sec)
sum(field)合計sum(value)
avg(field)平均avg(value)
min(field)最小値min(value)
max(field)最大値max(value)
median(field)中央値median(value)
stddev(field)標準偏差stddev(value)
variance(field)分散variance(value)
first(field)ウィンドウ最初値first(value)
last(field)ウィンドウ最終値last(value)

DISTINCT集計​

SELECT count(distinct tag_id) AS unique_tags
FROM Point.win:time(1 min)

CASE との結合​

SELECT
count(CASE WHEN value > 80 THEN 1 END) AS high_count,
count(CASE WHEN value <= 80 THEN 1 END) AS ok_count
FROM Point.win:time(1 min)
WHERE tag_id = 'MOTOR-001.TEMP'

時系列関数​

関数意味例
prev(N, field)N段階前後の値value - prev(1, value) (直前値との差)
prevwindow(field)ウィンドウ内すべての過去値配列prevwindow(value)
rate(field)単位時間あたりの変化率rate(value)

グループ化・ソート​

GROUP BY​

-- 자산별 최근 1분 평균 온도
SELECT asset_id, avg(value) AS avg_temp
FROM Point.win:time(1 min)
WHERE tag_id LIKE '%.TEMP'
GROUP BY asset_id

HAVING — 集計後フィルタ​

-- 평균 > 80 인 자산만
SELECT asset_id, avg(value) AS avg_temp
FROM Point.win:time(1 min)
WHERE tag_id LIKE '%.TEMP'
GROUP BY asset_id
HAVING avg(value) > 80

ORDER BY · LIMIT​

-- 가장 뜨거운 5개 자산
SELECT asset_id, max(value) AS peak
FROM Point.win:time(5 min)
WHERE tag_id LIKE '%.TEMP'
GROUP BY asset_id
ORDER BY peak DESC
LIMIT 5

LIMIT は結果emit時点の最上位N件のみを含めます。


JOIN — ストリーム結合​

2つ以上のストリームを時間的に整列させてジョインできます。

-- 같은 자산에서 같은 시간대의 온도와 압력을 한 행으로
SELECT p1.value AS temp, p2.value AS pressure, p1.asset_id
FROM Point.win:time(1 sec) AS p1,
Point.win:time(1 sec) AS p2
WHERE p1.tag_id LIKE '%.TEMP'
AND p2.tag_id LIKE '%.PRESSURE'
AND p1.asset_id = p2.asset_id

資産イベント + ワークオーダー ジョイン​

SELECT e.asset_id, e.event_type, w.order_id, w.status
FROM AssetEvent.win:time(5 min) AS e,
WorkOrder.win:time(5 min) AS w
WHERE e.asset_id = w.asset_id
AND e.event_type = 'STARTUP'
AND w.status = 'START'

2つのストリームの時間ウィンドウが重複している間のみジョイン結果が発生します。時間単位が異なるデータを比較する場合は win:time_batch で近似周期に合わせてください。


パターンマッチング​

EQLの強力な機能 — 「イベントAの後、N秒以内にBが(不)発生」といったシーケンスを定義できます。

every — 毎回マッチング​

SELECT * FROM pattern [
every a = AssetEvent(event_type = 'STARTUP')
-> b = AssetEvent(event_type = 'SHUTDOWN', asset_id = a.asset_id)
where timer:within(60 sec)
]

開始イベント → 60秒以内に停止イベント のペアを毎回マッチング。短時間稼働後に即座に停止する異常パターンを検知。

not — N時間の間発生しない​

SELECT * FROM pattern [
every a = AssetEvent(event_type = 'STARTUP')
-> ( timer:interval(30 min)
and not AssetData(asset_id = a.asset_id) )
]

開始後30分間データが流入しない場合にマッチング (応答のない資産を検知)。

and / or — 同時またはいずれか​

SELECT * FROM pattern [
( every AssetAlarm(priority = 'ERROR') )
and
( every WorkOrder(status = 'START') )
]

パターンマッチングの核となるキーワード​

キーワード意味
every <e>e が発生するたびにマッチング
e1 -> e2e1 の次に e2 が発生 (順序マッチング)
e1 and e22つのイベントがともに発生 (順序不問)
e1 or e2いずれか一方が発生
not ee が発生しない
timer:within(<duration>)指定時間内にのみマッチング
timer:interval(<duration>)指定時間分待機

時間・状態関数​

時間関数​

関数意味
current_timestamp現在時刻 (ms)
current_date()本日の日付 (yyyy-MM-dd)
timestamp(field)イベントのtimestamp抽出
hour_of_day(ts)0~23時
day_of_week(ts)1(日)~7(土)
minute_of_hour(ts)0~59分
dayofmonth(ts)1~31日
-- 야간 (22시~6시) 발생 알람만
SELECT * FROM Alarm.win:time(1 hour)
WHERE hour_of_day(ts) >= 22 OR hour_of_day(ts) < 6

状態関数​

関数意味
tag('<tag_id>')そのタグの最新値 (PointMapコンテキスト)
prev_status(asset_id)資産の直前状態
health(asset_id)資産ヘルス状態 (OK/WARN/ERROR/UNKNOWN)
is_in_shift(asset_id)資産がシフト内にあるか

算術・文字列関数​

関数意味
abs(x) / round(x, n) / floor(x) / ceil(x)数学
pow(x, y)xのy乗
sqrt(x)平方根
length(s)文字列長
upper(s) / lower(s)大小文字変換
substring(s, start, len)部分文字列
concat(a, b, ...)結合

変数とコンテキスト​

変数 — 動的閾値​

-- 변수 정의 (운영자가 화면에서 조정 가능)
create variable double max_temp = 80;

-- 변수 사용
SELECT * FROM Point.win:time(1 sec)
WHERE tag_id LIKE '%.TEMP' AND value > max_temp

変数の値は運用中に変更でき、すべてのEQLルールが即座に新値を適用します。

コンテキスト — 時間/条件ベースの有効化​

Platformには頻用されるコンテキストがあらかじめ定義されており、そのまま利用可能です。

コンテキスト有効条件
EVERY_1_MINUTES1分ごと
EVERY_5_MINUTES5分ごと
EVERY_10_MINUTES10分ごと
EVERY_30_MINUTES30分ごと
EVERY_1_HOURS1時間ごと
EVERY_3_HOURS3時間ごと
EVERY_6_HOURS6時間ごと
EVERY_12_HOURS12時間ごと
DAY_WORK_TIME平日 09:00~18:00
-- 5분마다 한 번씩 평균 온도 emit (그 사이에는 결과가 안 옴)
context EVERY_5_MINUTES
SELECT avg(value) AS avg_temp
FROM Point.win:time(5 min)
WHERE tag_id = 'MOTOR-001.TEMP'
-- 주간 근무시간에만 평가
context DAY_WORK_TIME
SELECT * FROM AssetAlarm.win:time(1 sec)
WHERE priority = 'ERROR'

実践例12選​

例 1 — リアルタイムのシングルタグモニタリング​

SELECT value, ts, quality
FROM Point.win:time(1 sec)
WHERE tag_id = 'MOTOR-001.SPEED'

例 2 — 閾値超過の即時検知​

SELECT tag_id, value, ts
FROM Point.win:time(1 sec)
WHERE tag_id LIKE '%.TEMP' AND value > 90

例 3 — 資産別5分平均 (5分ごとにemit)​

context EVERY_5_MINUTES
SELECT asset_id, avg(value) AS avg_temp, max(value) AS peak
FROM Point.win:time(5 min)
WHERE tag_id LIKE '%.TEMP'
GROUP BY asset_id

例 4 — 変量 (直前値比)​

SELECT tag_id, value, value - prev(1, value) AS delta
FROM Point.win:length(2)
WHERE tag_id = 'TANK-001.LEVEL'

例 5 — 夜間シフトのERRORアラームのみ​

SELECT tag_id, priority, band_message, ts
FROM Alarm.win:time(1 sec)
WHERE priority = 'ERROR'
AND hour_of_day(ts) >= 22 OR hour_of_day(ts) < 6

例 6 — 資産ヘルス遷移 (OK → WARN)​

SELECT asset_id, status, prev_status, ts
FROM AssetHealthStatus.win:time(1 sec)
WHERE prev_status = 'OK' AND status = 'WARN'

例 7 — ワークオーダーOEE低調​

SELECT order_id, asset_id, oee, availability, performance, quality
FROM OEE.win:time(1 sec)
WHERE oee < 0.6

例 8 — 30分間応答のない資産検知​

SELECT * FROM pattern [
every a = AssetData()
-> ( timer:interval(30 min)
and not AssetData(asset_id = a.asset_id) )
]

例 9 — 開始直後の停止 (不安定稼働)​

SELECT * FROM pattern [
every a = AssetEvent(event_type = 'STARTUP')
-> b = AssetEvent(event_type = 'SHUTDOWN', asset_id = a.asset_id)
where timer:within(60 sec)
]

例 10 — 複数タグの同時比較 (PointMap)​

SELECT
tag('MOTOR-001.TEMP') AS temp,
tag('MOTOR-001.PRESSURE') AS pressure,
tag('MOTOR-001.VIBRATION') AS vibration
FROM PointMap.win:time(1 sec)

例 11 — ライン単位の時間あたり累積生産量​

context EVERY_1_HOURS
SELECT asset_id, sum(value) AS hourly_count
FROM AssetAggregation.win:time(1 hour)
WHERE agg_type = 'PRODUCED' AND asset_id LIKE 'LINE-%'
GROUP BY asset_id

例 12 — アラーム発生上位10資産​

context EVERY_10_MINUTES
SELECT asset_id, count(*) AS alarm_count
FROM AssetAlarm.win:time(10 min)
GROUP BY asset_id
ORDER BY alarm_count DESC
LIMIT 10

パフォーマンスガイド​

1. ウィンドウサイズを意図的に小さく​

-- ❌ 나쁜 예 — 24시간을 메모리에 유지
SELECT avg(value) FROM Point.win:time(24 hour)

-- ✅ 좋은 예 — 1시간만 메모리에 유지 + context 로 emit 주기 분리
context EVERY_1_HOURS
SELECT avg(value) FROM Point.win:time(1 hour)

2. WHERE句をトリガーに近づける​

タグID・資産ID・サイトIDなどの静的フィルタは WHERE句の最前面 に配置してください。後続の GROUP BY/HAVING より先に評価されます。

3. LIKE '%...%' 両面ワイルドカードはコスト高​

-- ❌ 나쁜 예
WHERE tag_id LIKE '%TEMP%'

-- ✅ 좋은 예
WHERE tag_id LIKE '%.TEMP' -- 접미사 매칭만

4. パターンマッチングは短いウィンドウと共に​

pattern [ ... timer:within(<n-minutes>) ] の時間限定子を省略しないでください。無限パターンはメモリを占有し続けます。

5. 結果emit頻度の調整​

context EVERY_N_MINUTES コンテキストでEQL自体の評価は1秒単位で行い、emitのみをN分ごと に行うよう分離することで、ダウンストリームの負荷を軽減できます。


よくある質問​

Q. EQLクエリを入力しましたが、結果画面に何も表示されません。 A. 以下を確認してください。① FROM Point のみを記述していないか — ウィンドウが必要です (Point.win:time(1 sec))。② WHERE条件が狭すぎてマッチングされていないか。③ 右上の ▶ 開始ボタンを押したか。④ 結果パネルが ⏸ 中止状態になっていないか。

Q. SQLと何が違いますか? A. 最大の違いは ウィンドウ の概念です。EQLは無限ストリーム上で動作するため、「どの範囲」を指定する必要があります。その他 pattern [ ... ] シーケンスマッチングと context 時間コンテキストはSQLにない機能です。

Q. win:time(1 sec) と win:time_batch(1 sec) の違いは? A. win:time(1 sec) は sliding — イベントが流入するたびに結果を更新。win:time_batch(1 sec) は tumbling — 1秒単位でまとめ、1秒が満了した瞬間にのみ一度だけemit。正確に1秒ごとの結果が必要な場合はbatchを使用してください。

Q. pattern [ ... ] と一般的な SELECT ... WHERE ... の違いは? A. SELECT は単一のイベント(またはウィンドウ)を見て評価しますが、pattern は イベントシーケンス (Aの次にB、AがなくBなど) を評価します。時間的順序・因果関係が重要な場合はpatternを使用してください。

Q. 登録した変数は即座に反映されますか? A. はい。create variable で定義した変数の値を画面で変更すると、すでに配信済みのすべてのEQLルールが次回の評価から新値を使用します。

Q. EQLマッチング結果をアラームで送信するには? A. CEP → トリガー にEQLを登録し「MQストリーミング」または「ストレージ保存」オプションを有効にするか、アラーム → EQLアラーム にEQLを登録することで、マッチング時にアラームが自動発行されます。

Q. 資産単位のルールをすべての資産に一括適用できますか? A. CEP → ステートメント で資産単位のEQLルールを定義し、モデル/オントロジーでそのルールを資産カテゴリにマッピングすれば、同じカテゴリの全資産に自動配信されます。資産が追加されるたびに自動的に適用されます。

Q. EQL一行で2つのストリームを同時に扱えますか? A. はい。上記の JOIN セクションの例のように、2つのストリームを FROM 句にカンマ区切りで列挙し、WHERE でジョイン条件を記述してください。

Q. 結果が多く出過ぎます。 A. LIMIT N で上位N件のみにするか、context EVERY_N_MINUTES でemit周期を延ばすか、win:time_batch を使用してバッチウィンドウでまとめてください。WHERE句をより厳格に設定することも効果的です。

Q. EQLの作成練習はどこで行えますか? A. CEP → クエリ 画面がEQLの実習ツールです。一行入力して ▶ 実行すれば即座に結果を確認できます。上記の 実践例12選 からコピーして試してください。


関連画面​