【问题标题】:KQL Join on max valueKQL 加入最大值
【发布时间】:2021-03-05 23:05:46
【问题描述】:

我需要加入一个表以从该右侧表中返回 MAX 值。我曾尝试使用“数据表”来模拟它,但失败得很惨:(。我会尝试用文字来描述。

T1 = datatable(ID:int, Properties:string, ConfigTime:datetime) [1,'a,b,c','2021-03-04 00:00:00']

T2 = datatable(ID:int, Properties:string, ConfigTime:datetime) [2,'a,b,c','2021-03-02 00:00:00', 3,'a,b','2021-03-01 00:00:00', 4,'c','2021-03-20 00:00:00']

我将其用作 T2 的更新策略,它具有 T1 的来源。所以我想从 T1 中选择行,然后加入 T2 中时间戳最高的行。我的第一次尝试如下:

T1 | join kind=inner T2 on Id
   | summarize arg_max(ConfigTime1, Id, Properties, Properties1, ConfigTime) by Id
   | project Id, Properties, ConfigTime

在我的实际更新策略中,我合并了 T1 和 T2 的属性,然后写入 T2,但为简单起见,我暂时保留了它。

目前,我的 T2 中没有从更新策略中获得任何输出。任何关于我应该这样做的另一种方式的指导将不胜感激。谢谢

【问题讨论】:

    标签: azure-data-explorer kql


    【解决方案1】:

    您似乎想将 arg_max 计算推入连接的 T2 端,如下所示:

    T1 
    | join kind=inner (
       T2 
       | summarize arg_max(ConfigTime1, Id, Properties, Properties1, ConfigTime) by Id
       | project Id, Properties, ConfigTime
    ) on Id
    

    请注意,为了确保可接受的性能,您希望限制 arg_max 搜索的时间范围,因此您应该考虑在 arg_max 之前使用基于时间的过滤器。

    【讨论】:

    • 嗨 Avnera,是的,T2 应该包含给定 Id 的最新属性,我遇到的困难是 T1 将在每个 Id 更改时收到部分属性包,更新策略T2 需要从 T1 接收更新并从 T2 获取最新的属性包以合并来自 T1 的属性,从而生成一个组合的、更新的属性包,然后可以将其写入 T2。如果 T2 中的属性条目不是所有完整的属性集(即某些行是部分属性),我不确定物化视图是否有效。
    • 我明白了。为什么不只在 T2 上应用 arg_max 然后加入?即:T1 | join kind=inner (T2 | summarize arg_max(ConfigTime1, Id, Properties, Properties1, ConfigTime) by Id | project Id, Properties, ConfigTime) on Id 请注意,为确保可接受的性能,您希望限制 arg_max 搜索的时间范围,因此您应该在 arg_max 之前考虑基于时间的过滤器
    • 非常感谢 Avnera,你帮了大忙 :)
    【解决方案2】:

    我认为你正在寻找的是一个工会

    let T1 = datatable(ID:int, Properties:string, ConfigTime:datetime) [
        1,'a,b,c','2021-03-04 00:00:00'
    ];
    let T2 = datatable(ID:int, Properties:string, ConfigTime:datetime) [
        2,'a,b,c','2021-03-02 00:00:00', 
        3,'a,b','2021-03-01 00:00:00', 
        4,'c','2021-03-20 00:00:00'
    ];
    

    这里是一个使用summary max变量的例子:

    let Latest = toscalar(T2 | summarize max(ConfigTime));
    T1
    | union (T2 | where ConfigTime == Latest)
    

    结果将保留 T1 中的条目,仅保留 T2 中的最新条目。

    如果这不能反映您的预期结果,请显示您的预期输出。

    【讨论】:

    • 嗨,作为一个表的更新策略,最终写入一行,我想我需要一个连接,以便所有列都保留在一行上,我可以“投影”我在最终输出中需要的列。一个示例输出是 ID、Properties、ConfigTime,其中属性是 T2 中最新属性的合并包,并使用 T1 中的部分属性进行了更新。
    • 抱歉,理解您想要实现的目标有点困难。一张图说一千个字。你能用你的即时预期结果和期望的最终结果更新你的问题吗?如果您有 Excel,则可以轻松粘贴模拟结果
    猜你喜欢
    • 2013-03-17
    • 2020-12-28
    • 2020-07-31
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2015-01-14
    • 1970-01-01
    相关资源
    最近更新 更多