Обобщение динамических значений с помощью запроса Kusto в обозревателе данных Azure

У меня есть этот запрос, который почти работает:

datatable (timestamp:datetime, value:dynamic)
[
datetime("2021-04-19"), "a",
datetime("2021-04-19"), "b",
datetime("2021-04-20"), 1,
datetime("2021-04-20"), 2,
datetime("2021-04-21"), "b",
datetime("2021-04-22"), 2,
datetime("2021-04-22"), 3,
]
| project timestamp, stringvalue=iif(gettype(value)=="string", tostring(value), ""), numericvalue=iif(gettype(value)=="long", toint(value), int(null))
| summarize any(stringvalue), avg(numericvalue) by bin(timestamp, 1d)
| project timestamp, value=iif(isnan(avg_numericvalue), any_stringvalue, avg_numericvalue)

Это разбивает значения в поле значения на строковое значение, если значение является строковым, а числовое значение - длинным. Затем он суммирует значения на основе дневного уровня, для строковых значений просто принимает любое значение, а для числовых значений вычисляет среднее.

После этого я хочу вернуть значения в поле value.

Я думал, что последняя строка может быть такой, как показано ниже, но динамической функции нужны только литералы

| project timestamp, value=iif(isnan(avg_numericvalue), dynamic(any_stringvalue), dynamic(avg_numericvalue))

Если я сделаю это так, это действительно сработает:

| project timestamp, value=iif(isnan(avg_numericvalue), parse_json(any_stringvalue), parse_json(tostring(avg_numericvalue)))

Но есть ли лучший способ, чем преобразовать его в json и обратно?


person Mathias Rönnlund    schedule 22.04.2021    source источник


Ответы (1)


iff ожидает совпадения типов 2-го и 3-го аргументов. В вашем случае один - это число, а другой - строка. Чтобы решить эту проблему, просто добавьте tostring() вокруг числа:

datatable (timestamp:datetime, value:dynamic)
[
datetime("2021-04-19"), "a",
datetime("2021-04-19"), "b",
datetime("2021-04-20"), 1,
datetime("2021-04-20"), 2,
datetime("2021-04-21"), "b",
datetime("2021-04-22"), 2,
datetime("2021-04-22"), 3,
]
| project timestamp, stringvalue=iif(gettype(value)=="string", tostring(value), ""), numericvalue=iif(gettype(value)=="long", toint(value), int(null))
| summarize any(stringvalue), avg(numericvalue) by bin(timestamp, 1d)
| project timestamp, value=iif(isnan(avg_numericvalue), any_stringvalue, tostring(avg_numericvalue))
person Slavik N    schedule 22.04.2021