Partilhar via


Toscalar()

Aplica-se a: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Retorna um valor constante escalar da expressão avaliada.

Esta função é útil para consultas que exigem cálculos em estágios. Por exemplo, calcule uma contagem total de eventos e use o resultado para filtrar grupos que excedam uma determinada porcentagem de todos os eventos.

Quaisquer duas instruções são separadas por ponto-e-vírgula.

Sintaxe

toscalar( expressão)

Saiba mais sobre convenções de sintaxe.

Parâmetros

Designação Tipo Necessário Descrição
expressão string ✔️ O valor a ser convertido em um valor escalar.

Devoluções

Um valor constante escalar da expressão avaliada. Se o resultado for uma tabela, a primeira coluna e a primeira linha serão tomadas para conversão.

Dica

Você pode usar uma instrução let para legibilidade da consulta ao usar toscalar().

Limitações

toscalar() não pode ser aplicado em um cenário que aplica a função em cada linha. Isso ocorre porque a função só pode ser calculada um número constante de vezes durante a execução da consulta. Normalmente, quando essa limitação é atingida, o seguinte erro é retornado: can't use '<column name>' as it is defined outside its row-context scope.

No exemplo a seguir, a consulta falha com o erro:

'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)

Essa falha pode ser atenuada usando o operador join, como no exemplo a seguir:

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

Output

x y
1 2
3 4
5 6

Padrões adicionais de mitigação para cenários do mundo real

Em muitos cenários práticos, pode querer calcular um valor escalar por linha usando uma expressão que realiza a sua própria agregação, tais como:

| extend result = toscalar(T | where Key == key | summarize max(Value))

Este padrão falha porque toscalar() não pode ser avaliado uma vez por linha. Use um dos padrões de mitigação suportados abaixo.

  1. Pré-agregue os dados uma vez e depois junte os resultados agregados de volta à tabela principal para melhorar a eficiência.
let summary =
    T
    | summarize maxValue = max(Value) by Key;

Dataset1
| join kind=leftouter summary on Key
| project Key, maxValue
  1. Use arg_max() para recuperar a linha com o valor mais alto. Isto é útil quando precisas tanto do valor máximo como das colunas associadas.
let summary =
    T
    | summarize arg_max(Timestamp, *) by Key;

Dataset1
| lookup summary on Key
  1. Use um lookup para mapeamentos de chave/valor para evitar violações de contexto de linha e garantir consultas eficientes em tabelas de dimensões.
let lookupTable =
    T | summarize maxValue = max(Value) by Key;

Dataset1
| lookup lookupTable on Key
  1. Utilizar funções janela ou make-series para agregações de janelas temporais
Dataset1
| make-series maxValue = max(Value)
      on Timestamp
      from ago(1h) to now()
      step 1m
      by Key

Exemplos

Os exemplos nesta seção mostram como usar a sintaxe para ajudá-lo a começar.

Definir intervalo para avaliação

Avalie Start, Ende Step como constantes escalares e use o resultado para range avaliação.

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

Output

z Início fim passo a passo
1 1 9 2
3 1 9 2
5 1 9 2
7 1 9 2
9 1 9 2

Gerar GUID fixo e dinâmico

O exemplo a seguir mostra como toscalar() pode ser usado para gerar um guidfixo, calculado precisamente uma vez, e valores dinâmicos para guid.

let g1 = toscalar(new_guid());
let g2 = new_guid();
range x from 1 to 2 step 1
| extend x=g1, y=g2

Output

x y
E6A15E72-756D-4C93-93D3-FE85C18D19A3 C2937642-0D30-4B98-A157-A6706E217620
E6A15E72-756D-4C93-93D3-FE85C18D19A3 C6A48CB3-9F98-4670-BF5B-589D0E0DCAF5