如何解决如何从 AzureDataExplorer/Kusto 中的子查询引用外部查询以进行过滤 + 扩展?
我有两个表,它们都包含某个实体的健康事件。表 1 包含相隔几分钟的频繁事件。表 2 可能相隔几分钟到几个月。我想将表 2 中的最新健康事件与某个实体的表 1 相关联。
let Table1 = datatable (Table1Timestamp : datetime,Table1NameOfDataElement : string)
[
datetime(2021-05-11 19:05:00),'foo',datetime(2021-05-11 19:15:00),datetime(2021-05-11 19:12:00),datetime(2021-05-11 19:09:00),'bar',];
let Table2 = datatable (Table2Timestamp : datetime,Table2NameOfDataElement : string,Other: int)
[
// Data is ragged,days before first entry but is current state of 'foo'
datetime(2021-05-09 19:05:00),1,datetime(2021-05-09 19:05:00),2,3,];
Table1
| where Table1Timestamp between (datetime(2021-05-11 19:00:00) .. datetime(2021-05-11 20:00:00))
// determine state of entity in table 1 every 10 minutes
| summarize arg_max(Table1Timestamp,*) by Table1NameOfDataElement,TimeInterval = bin(Table1Timestamp,10minutes)
// Find the row in table2 that is closest in time proximity to the row from table 1
// This naive approach will not compile
| extend MostRecentColumnInOtherTable = toscalar(Table2
| where Table2Timestamp < **Table1TimestamP**
| where Table2NameOfDataElement == **Table1NameOfDataElement**
| top 1 by Table2Timestamp | project Other)
我不能这样做,因为 kql 不允许我在内部查询中引用外部查询中的列。我可以加入实体名称,但这只能解决一半的问题,我需要在表 1 中查找事件之前的最后一个条目。
一种幼稚的方法是在 bin(Table2Timestamp,10minutes) == bin(table1Timestamp,10minutes)
上加入,但表 2 中的数据可能与表 1 中的相关行相距数月,表 2 仅记录发生时的状态变化。
表 1 的窗口很窄,通常包含数千行。表 2 可以回溯数月并包含数十万行。
如何快速查找在 table1 中的一行之前发生的 table2 中的最后更改?
解决方法
找到对我有用的东西。只需对实体名称进行连接,然后用 arg_min 聚合即可找到时间戳差异最小的行
let Table1 = datatable (Table1Timestamp : datetime,Table1NameOfDataElement : string)
[
datetime(2021-05-11 19:05:00),'foo',datetime(2021-05-11 19:15:00),datetime(2021-05-11 19:12:00),datetime(2021-05-11 19:09:00),'bar',];
let Table2 = datatable (Table2Timestamp : datetime,Table2NameOfDataElement : string,Other: int)
[
// Data is ragged,days before first entry but is current state of 'foo'
datetime(2021-05-09 19:05:00),1,datetime(2021-05-09 19:05:00),2,3,];
Table1
| where Table1Timestamp between (datetime(2021-05-11 19:00:00) .. datetime(2021-05-11 20:00:00))
// determine state of entity in table 1 every 10 minutes
| summarize arg_max(Table1Timestamp,*) by Table1NameOfDataElement,TimeInterval = bin(Table1Timestamp,10minutes)
// Find the row in table2 that is closest in time proximity to the row from table 1
// This naive approach will not compile
| Lookup Table2 on $left.Table1NameOfDataElement == $right.Table1NameOfDataElement
| where Table1Timestamp < Table2Timestamp
| summarize arg_min(TimeDiffFromTimestamp = datetime_diff('second',Table1Timestamp,Table2Timestamp),*) by bin(Table1TimeStamp),Table1NameOfDataElement
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。