シーケンス関数
一部の演算子では、イベントのシーケンス (順序) が重要になります。アプリケーションで使用できるレコード・シーケンスは、以下のとおりです。
- シーケンスと時系列
- シーケンス関数
- レコード・インデックスの作成
- 値の平均、合計、および比較
- 変化の把握 (差分)
-
@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) の場合は、@SINCE0
は 0
を返します。
関数 | 結果 | 説明 |
---|---|---|
MEAN(FIELD) |
実数 | 指定された FIELD または FIELDS に対して、値の平均値を返します。 |
@MEAN(FIELD, EXPR) |
実数 | 現在のレコードを含めて、現在のノードが受け取った最後の EXPR レコードまでの、FIELD の値の平均値を返します。FIELD は数値型フィールドの名前でなければなりません。EXPR には、0 よりも大きな整数として評価される任意の式を使用することができます。EXPR を省略した場合、または EXPR の値が現在までに受け取ったレコード数を超えている場合は、現在までに受け取ったすべてのレコードの平均が返されます。 |
@MEAN(FIELD, EXPR, INT) |
実数 | 現在のレコードを含めて、現在のノードが受け取った最後の EXPR レコードまでの、FIELD の値の平均値を返します。FIELD は数値型フィールドの名前でなければなりません。EXPR には、0 よりも大きな整数として評価される任意の式を使用することができます。EXPR を省略した場合、または 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) |
Any | 上流の入力ノードまたはデータ型ノードで定義されるように、空白でない FIELD の最後の値を返します。それまでに読み込んだレコードの FIELD の値がすべて空白である場合は、$null$ を返します。ユーザー欠損値とも呼ばれる空白値は、各フィールドに個別に定義することができることに注意してください。 |
@MAX(FIELD) |
数値 | 指定された FIELD の最大値を返します。 |
@MAX(FIELD, EXPR) |
数値 | 現在のレコードを含めて、現在までに受け取った過去 EXPR レコードの FIELD の最大値を返します。FIELD は数値型フィールドの名前でなければなりません。EXPR は、0 より大きい整数を評価する任意の式を使用できます。 |
@MAX(FIELD, EXPR, INT) |
数値 | 現在のレコードを含めて、現在までに受け取った過去 EXPR レコードの FIELD の最大値を返します。FIELD は数値型フィールドの名前でなければなりません。EXPR は、0 より大きい整数を評価する任意の式を使用できます。EXPR を省略した場合、または EXPR の値が、現在までに受け取ったレコード数を超えている場合は、現在までに受け取ったすべてのレコードの最大値が返されます。INT には、参照する値の最大数を指定します。この方法は、2 つの引数だけを使用するよりも効率的です。 |
@MIN(FIELD) |
数値 | 指定された FIELD の最小値を返します。 |
@MIN(FIELD, EXPR) |
数値 | 現在のレコードを含めて、現在までに受け取った過去 EXPR レコードの FIELD の最小値を返します。FIELD は数値型フィールドの名前でなければなりません。EXPR は、0 より大きい整数を評価する任意の式を使用できます。 |
@MIN(FIELD, EXPR, INT) |
数値 | 現在のレコードを含めて、現在までに受け取った過去 EXPR レコードの FIELD の最小値を返します。FIELD は数値型フィールドの名前でなければなりません。EXPR は、0 より大きい整数を評価する任意の式を使用できます。EXPR を省略した場合、または EXPR の値が、現在までに受け取ったレコード数を超えている場合は、現在までに受け取ったすべてのレコードの最小値が返されます。INT には、参照する値の最大数を指定します。この方法は、2 つの引数だけを使用するよりも効率的です。 |
@OFFSET(FIELD, EXPR) |
Any | 現在のレコードからEXPR で指定された値のオフセットにあるレコードの FIELDの値を返します。正のオフセットがすでに通過したレコードを参照 (「後読み」) するのに対し、負のオフセットはまだ到着していないレコードに「先読み」を指定します。例えば、@OFFSET(Status, 1) は、前のレコードの Status フィールドの値を返します。一方、@OFFSET(Status, –4) は、値を取得するためにシーケンス内で 4 個先のレコードを (つまり、このノードをまだ通過していないレコードまで)「先読み」します。負の(先読み)オフセットは、定数として指定する必要があります。 負のオフセットに限っては、EXPR も任意の CLEM 式であり、現在のレコードに対してオフセットを与えるために評価されます。この場合、性能を改善するために、この関数の引数が 3 個のバージョンを使用する必要があります (次の関数を参照)。この式が、負ではない整数以外の値を返す場合、エラーになります。つまり、計算された先読みオフセットは正しく取得できません。
注 : 自己参照の @OFFSET 関数では、リテラルの先読みは使用できません。例えば、置換ノードでは、field1 の値を @OFFSET(field1,-2) のような式を使用して置換できません。
注: 置換ノードでは、フィールドを置換する際に、そのフィールドの値として事実上 2 つの異なる値 (具体的には、置換前の値と置換後の値) が存在します。
@OFFSET は、それ自体を参照する場合は置換後の値を参照します。この置換後の値は過去の行にのみ存在するため、自己参照の @OFFSET は過去の行のみを参照できます。自己参照 @OFFSET は将来を参照できないため、オフセットについて以下の検査を実行します。
|
@OFFSET(FIELD, EXPR, INT) |
Any | @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 を省略した場合、または EXPR の値が、現在までに受け取ったレコード数を超えている場合は、現在までに受け取ったすべてのレコードの標準偏差を返します。 |
@SDEV(FIELD, EXPR, INT) |
実数 | 現在のレコードを含めて、現在のノードが受け取った最後の EXPR レコードまでの、FIELD の値の標準偏差を返します。FIELD は数値型フィールドの名前でなければなりません。EXPR は、0 より大きい整数を評価する任意の式を使用できます。EXPR を省略した場合、または EXPR の値が、現在までに受け取ったレコード数を超えている場合は、現在までに受け取ったすべてのレコードの標準偏差を返します。INT には、参照する値の最大数を指定します。この方法は、2 つの引数だけを使用するよりも効率的です。 |
@SINCE(EXPR) |
Any | 任意の CLEM 式が真 (true) の場合に、EXPR から過ぎたレコード数を返します。 |
@SINCE(EXPR, INT) |
Any | 2 番目の引数 INT には、前方参照するレコードの最大数を指定します。EXPR が一度も真 (true) にならなかった場合、INT は @INDEX+1 です。 |
@SINCE0(EXPR) |
Any | 現在のレコードも考慮します。一方、@SINCE は現在のレコードは考慮しません。@SINCE0 は、現在のレコードについて EXPR が真 (true) の場合に 0 を返します。 |
@SINCE0(EXPR, INT) |
Any | 2 番目の引数 INT には、前方参照するレコードの最大数を指定します。 |
@SUM(FIELD) |
数値 | 指定された FIELD または FIELDS に対して、値の合計値を返します。 |
@SUM(FIELD, EXPR) |
数値 | 現在のレコードを含めて、現在のノードが受け取った最後の EXPR レコードまでの、FIELD の値の合計値を返します。FIELD は数値型フィールドの名前でなければなりません。EXPR には、0 より大きい整数として評価される任意の式を使用できます。EXPR を省略した場合、または EXPR の値が現在までに受け取ったレコード数を超えている場合は、現在までに受け取ったすべてのレコードの合計が返されます。 |
@SUM(FIELD, EXPR, INT) |
数値 | 現在のレコードを含めて、現在のノードが受け取った最後の EXPR レコードまでの、FIELD の値の合計値を返します。FIELD は数値型フィールドの名前でなければなりません。EXPR には、0 より大きい整数として評価される任意の式を使用できます。EXPR を省略した場合、または EXPR の値が現在までに受け取ったレコード数を超えている場合は、現在までに受け取ったすべてのレコードの合計が返されます。INT には、参照する値の最大数を指定します。この方法は、2 つの引数だけを使用するよりも効率的です。 |
@THIS(FIELD) |
Any | 現在のレコードの FIELD で指定された名前のフィールドの値を返します。@SINCE 式でのみ使用されます。 |