傳回評估表達式的純量常數值。
此函式適用於需要分段計算的查詢。 例如,計算事件總數,然後使用結果來篩選超過所有事件特定百分比的群組。
任何兩個語句都會以分號分隔。
語法
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
- 使用 a
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 |