使用 toscalar 的 Kusto 子查询选择 - returns 仅最后匹配的记录

Kusto sub query selection using toscalar - returns only last matching record

我指的是sqlcheatsheet - Nested queries

查询 1:

traces
    | where customDimensions.Domain == "someDomain"
    | where message contains "some-text" 
    | project itemId=substring(itemId,indexof(itemId,"-"),strlen(itemId))

结果:

itemId

-c580-11e9-888a-8776d3f65945
-c580-11e9-888a-8776d3f65945
-c580-11e9-9b01-c3be0f4a2bf2

查询 2:

traces
    | where customDimensions.Domain == "someDomain"
    | where itemId has toscalar(
    traces
        | where customDimensions.Domain == "someDomain"
        | where message contains "some-text"  
        | project itemId=substring(itemId,indexof(itemId,"-"),strlen(itemId)))

第二个查询的结果returns条记录只匹配子查询的最后一条记录

即:) > -c580-11e9-9b01-c3be0f4a2bf2

问题:

如何得到与所有三项匹配的整个结果集。

我的要求是获取特定请求的整个日志序列。

为了获得以下输入,我可以获取一个日志,从中我可以找到 ItemId

itemId 看起来像 "b5066283-c7ea-11e9-9e9b-2ff40863cba4"。与此请求相关的所有日志的其余部分必须具有 "-c7ea-11e9-9e9b-2ff40863cba4" 此值。只有第一部分会像 b5066284 , b5066285, b5066286 这样递增。

toscalar(),顾名思义,return是一个标量值。

给定一个包含 N 列和 M 行的表格参数,它将 return 第一列和第一行中的值。

例如:下面将return一个单一的值- 1


let T = datatable(a:int, b:int, c:int)
[
    1,2,3,
    4,5,6,
    7,8,9,
]
;
print toscalar(T)

如果我正确理解你的第二个查询的意图,你应该能够通过使用 has_any.

来实现你的要求

例如:


let T = datatable(item_id:string)
[
    "c580-11e9-888a-8776d3f65945",
    "c580-11e9-888a-8776d3f65945",
    "c580-11e9-9b01-c3be0f4a2bf2",
]
;
T
| where item_id has_any (
    (
        T
        | parse item_id  with * "-" item_id
    )
)