返回所计算的表达式的标量常数值。
此函数对于需要暂存计算的查询很有用。 例如,计算事件总数,然后使用结果筛选超过所有事件的特定百分比的组。
任何两个语句都用分号分隔。
语法
toscalar(
表达式)
详细了解语法约定。
参数
| 客户 | 类型 | 必需 | 说明 |
|---|---|---|---|
| expression | string |
✔️ | 要转换为标量值的值。 |
返回
所计算表达式的标量常数值。 如果结果为表格,则采用第一列和第一行进行转换。
限制
toscalar() 不能应用于对每一行应用该函数的方案。 这是因为在查询执行期间,该函数只能计算一定的次数。
通常,当达到此限制时,将返回以下错误:can't use '<column name>' as it is defined outside its row-context scope.
在以下示例中,查询失败并显示错误:
'toscalar': can't use 'x' as it is defined outside its row-context scope.
let _dataset1 = datatable(x:long)[1,2,3,4,5];
let _dataset2 = datatable(x:long, y:long) [ 1, 2, 3, 4, 5, 6];
let tg = (x_: long)
{
toscalar(_dataset2| where x == x_ | project y);
};
_dataset1
| extend y = tg(x)
可以使用 join 运算符缓解此故障,如以下示例所示:
let _dataset1 = datatable(x: long)[1, 2, 3, 4, 5];
let _dataset2 = datatable(x: long, y: long) [1, 2, 3, 4, 5, 6];
_dataset1
| join (_dataset2) on x
| project x, y
输出
| x | y |
|---|---|
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |
实际方案的其他缓解模式
在许多实际方案中,你可能希望使用执行自身聚合的表达式计算每行的标量值,例如:
| extend result = toscalar(T | where Key == key | summarize max(Value))
此模式失败,因为 toscalar() 无法每行评估一次。
使用以下支持的缓解模式之一。
- 预先聚合数据一次,然后将聚合结果联接回主表以提高效率。
let summary =
T
| summarize maxValue = max(Value) by Key;
Dataset1
| join kind=leftouter summary on Key
| project Key, maxValue
- 用于
arg_max()检索具有最大值的行。 当需要最大值和关联的列时,这非常有用。
let summary =
T
| summarize arg_max(Timestamp, *) by Key;
Dataset1
| lookup summary on Key
-
lookup使用键/值映射来避免行上下文冲突并确保有效的维度表查找。
let lookupTable =
T | summarize maxValue = max(Value) by Key;
Dataset1
| lookup lookupTable on Key
- 使用窗口函数或
make-series用于时间窗口聚合
Dataset1
| make-series maxValue = max(Value)
on Timestamp
from ago(1h) to now()
step 1m
by Key
示例
本节中的示例演示如何使用语法帮助你入门。
设置评估范围
将 Start、End 和 Step 作为标量常数计算,并将结果用于 range 计算。
let Start = toscalar(print x=1);
let End = toscalar(range x from 1 to 9 step 1 | count);
let Step = toscalar(2);
range z from Start to End step Step | extend start=Start, end=End, step=Step
输出
| z | start | end | 单步执行 |
|---|---|---|---|
| 1 | 1 | 9 | 2 |
| 3 | 1 | 9 | 2 |
| 5 | 1 | 9 | 2 |
| 7 | 1 | 9 | 2 |
| 9 | 1 | 9 | 2 |
生成固定和动态 GUID
以下示例演示如何使用 toscalar() 生成固定 guid、精确计算一次以及 guid的动态值。
let g1 = toscalar(new_guid());
let g2 = new_guid();
range x from 1 to 2 step 1
| extend x=g1, y=g2
输出
| x | y |
|---|---|
| e6a15e72-756d-4c93-93d3-fe85c18d19a3 | c2937642-0d30-4b98-a157-a6706e217620 |
| e6a15e72-756d-4c93-93d3-fe85c18d19a3 | c6a48cb3-9f98-4670-bf5b-589d0e0dcaf5 |