シーケンス関数

一部の演算子では、イベントのシーケンス (順序) が重要になります。

アプリケーションで使用できるレコード・シーケンスは、以下のとおりです。

  • シーケンスと時系列
  • シーケンス関数
  • レコード・インデックスの作成
  • 値の平均、合計、および比較
  • 変化の監視-差別化
  • @SINCE
  • オフセット値
  • その他のシーケンス機能

多くのアプリケーションでは、ストリームを通過している各レコードは、それぞれ個別で、他のすべてのレコードから独立したものと見なされます。 通常、このような場合は、レコードの順序は重要ではありません。

ただし、問題によっては、レコード・シーケンスが非常に重要になります。 特に時系列の場合がそうで、レコードのシーケンスは、イベントまたは発生の順序、すなわちシーケンスを表します。各レコードは、特定の瞬間のスナップショットを示します。 しかし、最も重要な情報は、瞬間的な値にあるのではなく、このような値が時間の経過に伴ってどのように変化し、動いていくのかということにあるのです。

もちろん、該当するパラメーターが時間以外のものであってもかまいません。 例えば、レコードが、線からの距離について実行される分析を示している場合でも、同じ原則が適用されます。

シーケンスおよび特殊関数は、次の特徴によってすぐに判別できます。

  • すべての接頭部が @ である
  • それらの名前は大文字で示されます。

シーケンス関数は、ノードによって現在処理中のレコード、すでにノードを通過したレコード、あるいはまだノードに到達していないレコードを参照します。 シーケンス関数は、 CLEM 式の他のコンポーネントと自由に混在させることができます。ただし、一部の関数には引数として使用できるものに制限があります。

ある事象が発生してから、またはある条件が真になってからの長さを知りたい場合があります。 その場合は、次のように @SINCE 関数を使用します。

@SINCE(Income > Outgoings) 

この関数は、この条件が真 (true) であった最後のレコードのオフセットを戻します。つまり、この条件が真 (true) であったレコードの前のレコード数です。 指定した条件が一度も真 (true) にならなかった場合、@SINCE@INDEX + 1 を返します。

@SINCE で使用される式の現在のレコードの値を参照したいこともあるでしょう。 関数 @THIS を使用して、フィールド名が常に現在のレコードに適用されるように指定します。 Concentration フィールドの値が、現在のレコードの 2倍より大きい最後のレコードのオフセットを調べるには、次のように記述します。

@SINCE(Concentration > 2 * @THIS(Concentration)) 

定義により、現在のレコードに対して真 (true) である条件を @SINCE に指定する場合があります。次に例を示します。

@SINCE(ID == @THIS(ID)) 

この理由により、 @SINCE は現行レコードの条件を評価しません。 前のレコードと現在のレコードに対して条件を評価する場合は、同様な関数 @SINCE0 を使用します。現在のレコードで条件が真 (true) の場合は、@SINCE00 を返します。

表 1. CLEM シーケンス関数
関数 結果 説明
MEAN(FIELD) 実数 指定された FIELD または FIELDS に対して、値の平均値を返します。
@MEAN(FIELD, EXPR) 実数 現在のレコードを含めて、現在のノードが受け取った最後の EXPR レコードまでの、FIELD の値の平均値を返します。 FIELD は数値型フィールドの名前でなければなりません。 EXPR は、0 より大きい整数を評価する任意の式を使用できます。 EXPR が省略されている場合、またはこれまでに受信したレコード数を超える場合は、これまでに受信したすべてのレコードの平均が返されます。
@MEAN(FIELD, EXPR, INT) 実数 現在のレコードを含めて、現在のノードが受け取った最後の EXPR レコードまでの、FIELD の値の平均値を返します。 FIELD は数値型フィールドの名前でなければなりません。 EXPR は、0 より大きい整数を評価する任意の式を使用できます。 EXPR が省略されている場合、またはこれまでに受信したレコード数を超える場合は、これまでに受信したすべてのレコードの平均が返されます。 INT には、参照する値の最大数を指定します。 この方法は、2 つの引数だけを使用するよりも効率的です。
@DIFF1(FIELD) 実数 FIELD の最初の差分を返します。 したがって、1 つの引数を指定する形式では、単純にフィールドの現在値と前の値の差分を返します。 前に関連するレコードが存在しない場合は、$null$ を返します。
@DIFF1(FIELD1, FIELD2) 実数 2 つの引数を指定する形式では、FIELD2 に関する FIELD1 の最初の差分を返します。 前に関連するレコードが存在しない場合は、$null$ を返します。 それは、@DIFF1(FIELD1)/@DIFF1(FIELD2) で算出されます。
@DIFF2(FIELD) 実数 FIELD の 2 番目の差分を返します。 したがって、1 つの引数を指定する形式では、単純にフィールドの現在値と前の値の差分を返します。 前に関連するレコードが存在しない場合は、$null$ を返します。 @DIFF2@DIFF(@DIFF(FIELD)) で算出されます。
@DIFF2(FIELD1, FIELD2) 実数 2 つの引数を指定する形式では、FIELD2 に関する FIELD1 の 2 番目の差分を返します。 前に関連するレコードが存在しない場合は、$null$ を返します。 これは、@DIFF1(FIELD1)/@DIFF1(FIELD2) - @OFFSET(@DIFF1(FIELD1),1)/@OFFSET(@DIFF1(FIELD2))) / @DIFF1(FIELD2) という複雑な計算です。
@INDEX 整数 現在のレコードのインデックスを返します。 インデックスは、レコードが現在のノードに到達したときにレコードに対して割り振られます。 最初のレコードにはインデックス 1 が与えられます。インデックスは、その後の各レコードに対して 1 ずつ増やされます。
@LAST_NON_BLANK(FIELD) 任意 上流の入力ノードまたはデータ型ノードで定義されるように、空白でない FIELD の最後の値を返します。 それまでに読み込んだレコードの FIELD の値がすべて空白である場合は、$null$ を返します。 ユーザー欠損値とも呼ばれる空白値は、各フィールドに個別に定義することができることに注意してください。
@MAX(FIELD) 数値 指定された FIELD の最大値を返します。
@MAX(FIELD, EXPR) 数値 現在のレコードを含めて、現在までに受け取った過去 EXPR レコードの FIELD の最大値を返します。 FIELD は数値型フィールドの名前でなければなりません。 EXPR は、0 より大きい整数を評価する任意の式を使用できます。
@MAX(FIELD, EXPR, INT) 数値 現在のレコードを含めて、現在までに受け取った過去 EXPR レコードの FIELD の最大値を返します。 FIELD は数値型フィールドの名前でなければなりません。 EXPR は、0 より大きい整数を評価する任意の式を使用できます。 EXPR が省略されている場合、またはこれまでに受信したレコード数を超える場合は、これまでに受け取ったすべてのレコードの最大値が返されます。 INT には、参照する値の最大数を指定します。 この方法は、2 つの引数だけを使用するよりも効率的です。
@MIN(FIELD) 数値 指定された FIELD の最小値を返します。
@MIN(FIELD, EXPR) 数値 現在のレコードを含めて、現在までに受け取った過去 EXPR レコードの FIELD の最小値を返します。 FIELD は数値型フィールドの名前でなければなりません。 EXPR は、0 より大きい整数を評価する任意の式を使用できます。
@MIN(FIELD, EXPR, INT) 数値 現在のレコードを含めて、現在までに受け取った過去 EXPR レコードの FIELD の最小値を返します。 FIELD は数値型フィールドの名前でなければなりません。 EXPR は、0 より大きい整数を評価する任意の式を使用できます。 EXPR が省略された場合、またはこれまでに受け取ったレコードの数を超えた場合は、これまでに受け取ったすべてのレコードの最小値が返されます。 INT には、参照する値の最大数を指定します。 この方法は、2 つの引数だけを使用するよりも効率的です。
@OFFSET(FIELD, EXPR) 任意 現在のレコードからEXPR で指定された値のオフセットにあるレコードの FIELDの値を返します。 正のオフセットがすでに通過したレコードを参照 (「後読み」) するのに対し、負のオフセットはまだ到着していないレコードに「先読み」を指定します。 例えば、@OFFSET(Status, 1) は、前のレコードの Status フィールドの値を返します。一方、@OFFSET(Status, –4) は、値を取得するためにシーケンス内で 4 個先のレコードを (つまり、このノードをまだ通過していないレコードまで)「先読み」します。 負の(先読み)オフセットは、定数として指定する必要があります。 正のオフセットのみの場合、 EXPR は任意の CLEM 式でもあります。これは、オフセットを提供する現在のレコードについて評価されます。 この場合、性能を改善するために、この関数の引数が 3 個のバージョンを使用する必要があります (次の関数を参照)。 この式が、負ではない整数以外の値を返す場合、エラーになります。つまり、計算された先読みオフセットは正しく取得できません。 自己参照 @OFFSET 関数では、リテラルの先読みが使用できないことに注意してください。 例えば、置換ノードでは@OFFSET(field1,-2)などの式を使用して field1 の値を置換することはできません。 置換ノードでは、フィールドに入力すると、そのフィールドには実質的に、事前に入力された値と、ポストフィル値の 2 つの異なる値があります。 @OFFSET は、それ自体を参照する場合は置換後の値を参照します。 この置換後の値は過去の行にのみ存在するため、自己参照の @OFFSET は過去の行のみを参照できます。 自己参照は今後 @OFFSET を参照できないため、オフセットの以下の検査を実行します。
  • オフセットがリテラルおよび将来のものである場合は、実行が開始される前にエラーが報告されます。
  • オフセットが式であり、ランタイムに評価結果が将来になる場合、@OFFSET によって $null$ が返されます。
1 つのノード内で「先読み」と「後読み」の両方を使用することはサポートされていません。
@OFFSET(FIELD, EXPR, INT) 任意 @OFFSET 関数と同じ演算を行いますが、3 番目の引数 INT に、前方参照する値の最大数を指定することができます。 オフセットを式から計算することができる場合、性能を改善するために、この 3 番目の引数を使用する必要があります。 例えば、@OFFSET(Foo, Month, 12) のような式では、システムが Foo の最後の 12 個の値だけを保持していればよいと判断できます。 3 番目の引数がなければ、安全のため、すべての値を保管しておく必要があります。オフセットの値が定数の場合 (定数である必要がある負の「先読み」オフセットの場合を含む)、3 番目の引数は無意味なので、この関数の 2 引数バージョンを使用してください。 前述の 2 引数バージョンの自己参照関数に関する注意事項を参照してください。 1 つのノード内で「先読み」と「後読み」の両方を使用することはサポートされていません。
@SDEV(FIELD) 実数 指定された FIELD または FIELDS に対して、値の標準偏差を返します。
@SDEV(FIELD, EXPR) 実数 現在のレコードを含めて、現在のノードが受け取った最後の EXPR レコードまでの、FIELD の値の標準偏差を返します。 FIELD は数値型フィールドの名前でなければなりません。 EXPR は、0 より大きい整数を評価する任意の式を使用できます。 EXPR が省略されている場合、またはこれまでに受信したレコード数を超える場合は、これまでに受け取ったすべてのレコードの標準偏差が返されます。
@SDEV(FIELD, EXPR, INT) 実数 現在のレコードを含めて、現在のノードが受け取った最後の EXPR レコードまでの、FIELD の値の標準偏差を返します。 FIELD は数値型フィールドの名前でなければなりません。 EXPR は、0 より大きい整数を評価する任意の式を使用できます。 EXPR が省略されている場合、またはこれまでに受信したレコード数を超える場合は、これまでに受け取ったすべてのレコードの標準偏差が返されます。 INT には、参照する値の最大数を指定します。 この方法は、2 つの引数だけを使用するよりも効率的です。
@SINCE(EXPR) 任意 任意の CLEM 式が真 (true) であったために、 EXPR 以降に渡されたレコードの数を返します。
@SINCE(EXPR, INT) 任意 2 番目の引数 INT には、前方参照するレコードの最大数を指定します。 EXPR が一度も真 (true) にならなかった場合、INT@INDEX+1 です。
@SINCE0(EXPR) 任意 現在のレコードも考慮します。一方、@SINCE は現在のレコードは考慮しません。@SINCE0 は、現在のレコードについて EXPR が真 (true) の場合に 0 を返します。
@SINCE0(EXPR, INT) 任意 2 番目の引数 INT には、前方参照するレコードの最大数を指定します。
@SUM(FIELD) 数値 指定された FIELD または FIELDS に対して、値の合計値を返します。
@SUM(FIELD, EXPR) 数値 現在のレコードを含めて、現在のノードが受け取った最後の EXPR レコードまでの、FIELD の値の合計値を返します。 FIELD は数値型フィールドの名前でなければなりません。 EXPR は、0 より大きい整数を評価する任意の式を使用できます。 EXPR が省略されている場合、またはこれまでに受信したレコード数を超える場合は、これまでに受け取ったすべてのレコードの合計が返されます。
@SUM(FIELD, EXPR, INT) 数値 現在のレコードを含めて、現在のノードが受け取った最後の EXPR レコードまでの、FIELD の値の合計値を返します。 FIELD は数値型フィールドの名前でなければなりません。 EXPR は、0 より大きい整数を評価する任意の式を使用できます。 EXPR が省略されている場合、またはこれまでに受信したレコード数を超える場合は、これまでに受け取ったすべてのレコードの合計が返されます。 INT には、参照する値の最大数を指定します。 この方法は、2 つの引数だけを使用するよりも効率的です。
@THIS(FIELD) 任意 現在のレコードの FIELD で指定された名前のフィールドの値を返します。 @SINCE 式でのみ使用されます。