如何解决循环遍历表格表达式并为 KUSTO
我有 2 个没有公共字段的表(Tab1、Tab2),我想在 Tab2 上为 Tab1 中的每一行运行一个查询,并且子查询中的条件应使用外部查询中的列值。
Pseudo code
tab1
| project timestamp,duration
tab2
| project event_time_t,data
pseudo code/ desired query
tab1 join tab2
| where event_time_t between (tab1.timestamp .. datetime_add('millisecond',toint(tab1.duration),tab1.timestamp))
我已经检查了以下选项,但无法正常工作
更新:
让我的问题更加清晰。
我想找到 T2 中位于 T1.timestamp 和 add_datetime(T1.timestamp + duration_millisecond) 之间的所有行
我确实尝试过交叉连接方法并得到了想要的结果,但由于我的 T2 表很大,所以成本很高。我可以像在 T-sql 相关子查询中那样以编程方式执行此操作,其中为 T1 中的每一行执行子查询并参考外部查询动态更改 between 子句?
let T1 = datatable(OperationID:sring,timestamp:datetime,duration_millisecond:int)
[
1,datetime(2021-02-15T10:56:28.768),22,2,datetime(2021-02-15T11:28:28.165),17,3,datetime(2021-02-15T12:29:48.954),90,4,datetime(2021-02-15T13:30:09.786),5,datetime(2021-02-15T14:30:22.333),6,];
let T2 = datatable(event_time_t:datetime,data:string)
[
datetime(2021-02-15T10:56:28.775),"Some string",datetime(2021-02-15T10:56:28.788),"Another string",datetime(2021-02-15T11:28:28.167),"Yet another string","Last string1",datetime(2021-02-15T12:29:48.999),"Last string2",datetime(2021-02-15T12:29:49.023),"Last string3",datetime(2021-02-15T12:29:49.025),"Last string4",datetime(2021-02-15T13:30:09.787),"Last string5",datetime(2021-02-15T14:30:22.335),"Last string6",datetime(2021-02-15T14:30:22.337),"Last string7",];
T1
| extend temp=1
| join kind=fullouter (
T2
| extend temp=1
) on temp
| project-away temp,temp1
| where event_time_t between (timestamp .. datetime_add('millisecond',duration_millisecond,timestamp))
预期结果:
Result = datatable(OperationID:sring,duration_millisecond:int,event_time_t:datetime,data:string)
[
1,datetime(2021-02-15T10:56:28.775),1,]
解决方法
您可以连接两个没有公共列的表,方法是向具有相同值的两列添加一个临时列(例如 | extend temp=1
),然后通过这个新临时 join
ing列(例如 | join kind=fullouter (...) on temp
)。
这是一个例子:
let T1 = datatable(timestamp:datetime,duration:timespan)
[
datetime(2021-02-15T10:56:28),time(00:05:00.0102814),datetime(2021-02-15T11:28:29),time(00:07:01.0245718),datetime(2021-02-15T12:29:48),time(01:00:00.6943432),datetime(2021-02-15T13:30:09),time(00:45:02.3022766),datetime(2021-02-15T14:30:22),time(00:10:06.2003221),];
let T2 = datatable(event_time_t:datetime,data:string)
[
datetime(2021-02-15T11:22:48.4361218Z),"Some string",datetime(2021-02-15T12:23:13.4319484Z),"Another string",datetime(2021-02-15T13:55:54.8762753Z),"Yet another string",datetime(2021-02-15T14:28:13.5785646Z),"Last string",];
T1
| extend temp=1
| join kind=fullouter (
T2
| extend temp=1
) on temp
| project-away temp,temp1
| where event_time_t between (timestamp .. duration)
顺便说一句,请注意,我简化了您的 between
过滤器,因此右侧将包含时间跨度,而不是日期时间 - 这样效率更高,更易于阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。