序列函数
对于某些操作,事件发生的顺序非常重要。
该应用程序允许您使用以下记录序列:
- 序列和时间序列
- 序列函数
- 记录索引
- 求平均值、求和以及比较数值
- 监控变化-差异化
@SINCE- 偏移值
- 其他序列设施
对于许多应用而言,流中经过的每条记录都可以被视为一个独立案例,与其他记录无关。 在这种情况下,记录的顺序通常并不重要。
然而,对于某些类问题,记录顺序非常重要。 这些典型的时间序列情况中,记录序列代表事件或发生的顺序。 每一条记录都代表特定时刻的快照;然而,许多最丰富的信息可能并不包含在瞬时值中,而是包含在瞬时值随时间变化和表现的方式中。
当然,相关参数可能不是时间。 例如,记录可以表示沿直线距离进行的分析,但同样的原则也适用。
序列和特殊功能可通过以下特征立即识别:
- 它们都以
@为前缀 - 它们的名称以大写形式给出
序列功能可以参考节点当前正在处理的记录、已经通过节点的记录,甚至包括尚未通过节点的记录。 序列函数可以自由地与 CLEM 表达式的其他组成部分混合,尽管有些对可用作其自变量的内容有限制。
示例
了解某事件或某种状况发生或持续了多久可能对您有所帮助。 使用 @SINCE 功能即可实现——例如:
@SINCE(Income > Outgoings)
此函数返回此条件为 true 的最后一条记录的偏移量,即,此条件为 true 的记录数之前的记录数。 如果条件从未成立, @SINCE 将返回 @INDEX + 1。
有时您可能需要在 @SINCE 使用的表达式中引用当前记录的值。 您可以使用 @THIS 功能,该功能指定字段名称始终适用于当前记录。 要查找 Concentration 字段值是当前记录两倍以上的最后一条记录的偏移量,可以使用:
@SINCE(Concentration > 2 * @THIS(Concentration))
在某些情况下,根据定义, @SINCE 给出的条件与当前记录相符——例如:
@SINCE(ID == @THIS(ID))
因此, @SINCE 不会评估其当前记录的条件。 如果您想评估当前记录以及之前记录的条件,请使用类似的功能 @SINCE0;如果当前记录的条件为真,则 @SINCE0 将返回 0。
| 函数 | 结果 | 描述 |
|---|---|---|
MEAN(FIELD) |
实数 | 返回指定 字段或指定字段的平均值。 |
@MEAN(FIELD, EXPR) |
实数 | 返回当前节点接收到的最近EXPR条记录 (包括当前记录) 中FIELD的平均值。 FIELD 必须是数字字段的名称。 EXPR 可以是任何大于0的整数。 如果省略了 EXPR ,或者EXPR超过了迄今为止收到的记录数,则返回迄今为止收到的所有记录的平均值。 |
@MEAN(FIELD, EXPR, INT) |
实数 | 返回当前节点接收的最后 EXPR 条记录(包括当前记录)的 FIELD 值的平均值。 FIELD 必须是数字字段的名称。 EXPR 可以是任何大于0的整数。 如果省略了 EXPR ,或者EXPR超过了迄今为止收到的记录数,则返回迄今为止收到的所有记录的平均值。 INT 指定了最大回溯值。 这比只使用两个参数要高效得多。 |
@DIFF1(FIELD) |
实数 | 返回 FIELD的第一个微分。 因此,单参数形式仅返回字段当前值和前次值之间的差值。 如果之前的相关记录不存在,则返回 $null$。 |
@DIFF1(FIELD1, FIELD2) |
实数 | 两参数形式给出 FIELD1 与 FIELD2。 如果之前的相关记录不存在,则返回 $null$。 计算结果为 @DIFF1(FIELD1)/@DIFF1(FIELD2)。 |
@DIFF2(FIELD) |
实数 | 返回 FIELD的二阶微分。 因此,单参数形式仅返回字段当前值和前次值之间的差值。 如果之前的相关记录不存在,则返回 $null$。 @DIFF2 计算结果为。 @DIFF(@DIFF(FIELD)) |
@DIFF2(FIELD1, FIELD2) |
实数 | 两参数形式给出 FIELD1 相对于 FIELD2。 如果之前的相关记录不存在,则返回 $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) |
编号 | 返回指定字段的最大值。 |
@MAX(FIELD, EXPR) |
编号 | 返回到目前为止接收到的最近EXPR条记录中 FIELD的最大值,包括当前记录。 FIELD 必须是数字字段的名称。 EXPR 可以是任何大于0的整数。 |
@MAX(FIELD, EXPR, INT) |
编号 | 返回到目前为止接收到的最近EXPR记录 中FIELD 的最大值,包括当前记录。 FIELD 必须是数字字段的名称。 EXPR 可以是任何大于0的整数。 如果省略了 EXPR ,或者EXPR超过了迄今为止收到的记录数,则返回迄今为止收到的所有记录的最大值。 INT 指定了最大回溯值。 这比只使用两个参数要高效得多。 |
@MIN(FIELD) |
编号 | 返回指定字段的最低值。 |
@MIN(FIELD, EXPR) |
编号 | 返回到目前为止接收到的最近EXPR记录 (包括当前记录) 中FIELD 的最小值。 FIELD 必须是数字字段的名称。 EXPR 可以是任何大于0的整数。 |
@MIN(FIELD, EXPR, INT) |
编号 | 返回到目前为止接收到的最近EXPR记录 (包括当前记录) 中FIELD 的最小值。 FIELD 必须是数字字段的名称。 EXPR 可以是任何大于0的整数。 如果省略了 EXPR ,或者EXPR超过了迄今为止收到的记录数,则返回迄今为止收到的所有记录中的最小值。 INT指定了 最大回溯值。 这比只使用两个参数要高效得多。 |
@OFFSET(FIELD, EXPR) |
任何 | 返回记录中 FIELD 的值,偏移量等于当前记录与 EXPR 的值之差。 正值偏移是指已经过去的记录(“回溯”),而负值偏移是指对尚未到达的记录的“前瞻”。 例如, @OFFSET(Status, 1) 返回前一条记录中 Status 字段的值,而 @OFFSET(Status, –4) 则“向前”查看四条记录(即尚未经过此节点的记录)以获取值。 请注意,负(向前)偏移必须指定为常量。 仅对于正偏移量, EXPR 也可以是任意 CLEM 表达式,该表达式将针对当前记录进行求值以提供偏移量。 在这种情况下,该函数的三个参数版本应该可以提高性能(见下一个函数)。 如果表达式返回非负整数以外的任何值,都会导致错误——也就是说,计算出的前瞻偏移量是不合法的。 请注意,自引用 @OFFSET 函数不能使用字面值查找。 例如,在 Filler 节点中,无法使用表达式 (例如 @OFFSET(field1,-2)) 替换 field1 的值。 在 "填充" 节点中,在填充字段时,该字段实际上有两个不同的值,即预填充值和后填充值。 当 @OFFSET 指代自身时,它指的是后填充值。 这种后填充值仅存在于过去的行中,因此自引用 @OFFSET 只能引用过去的行。 由于自引用 @OFFSET 无法引用 future ,因此它将执行以下偏移量检查:
|
@OFFSET(FIELD, EXPR, INT) |
任何 | 执行与 @OFFSET 函数相同的操作,并增加第三个参数 INT ,用于指定回溯的最大值。 如果偏移量是通过表达式计算的,那么第三个参数应该可以提高性能。 例如,在表达式 (例如@OFFSET(Foo, Month, 12)) 中,系统知道仅保留 Foo的最后 12 个值; 否则,它必须仅存储每个值。 如果偏移值是常数(包括负“前瞻”偏移,它必须是常数),第三个参数就没有意义了,应该使用这个函数的两个参数版本。 另请参阅前面描述的关于自引用函数的注释。 请注意,不支持在一个节点中同时使用 "lookahead" 和 "lookback"。 |
@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 指定了最大回溯值。 这比只使用两个参数要高效得多。 |
@SINCE(EXPR) |
任何 | 返回自任意 CLEM 表达式 EXPR为 true 以来已传递的记录数。 |
@SINCE(EXPR, INT) |
任何 | 添加第二个参数 INT ,指定要回溯的最大记录数。 如果 EXPR 从未为真, 则INT 为 @INDEX+1。 |
@SINCE0(EXPR) |
任何 | 考虑当前记录,而 @SINCE 不考虑; 如果 EXPR 对于当前记录为 true ,那么 @SINCE0 将返回 0。 |
@SINCE0(EXPR, INT) |
任何 | 添加第二个参数INT ,指定最大回溯记录数。 |
@SUM(FIELD) |
编号 | 返回指定字段 或指定字段组的值总和。 |
@SUM(FIELD, EXPR) |
编号 | 返回当前节点接收到的最近EXPR条记录 (包括当前记录) 中FIELD的值总和。 FIELD 必须是数字字段的名称。 EXPR 可以是任何大于0的整数。 如果省略了 EXPR ,或者EXPR超过了迄今为止收到的记录数,则返回迄今为止收到的所有记录的总和。 |
@SUM(FIELD, EXPR, INT) |
编号 | 返回当前节点接收到的最近EXPR条记录 (包括当前记录) 中FIELD的值总和。 FIELD 必须是数字字段的名称。 EXPR 可以是任何大于0的整数。 如果省略了 EXPR ,或者EXPR超过了迄今为止收到的记录数,则返回迄今为止收到的所有记录的总和。 INT 指定 了最大回溯值。 这比只使用两个参数要高效得多。 |
@THIS(FIELD) |
任何 | 返回当前记录中名为 FIELD 字段的值。 仅用于 @SINCE 表达。 |