如何从 AzureDataExplorer/Kusto 中的子查询引用外部查询以进行过滤 + 扩展?

如何解决如何从 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?