首页 > 解决方案 > 使用 Azure TimeSeries Insights 获取时间序列的最后一个值

问题描述

我如何查询时间序列中的最后一个(最近的)事件及其时间戳?

这里描述的方法对我不起作用,因为我不能保证最近的事件在固定的时间窗口内。就我而言,该事件可能已在数小时或数天前收到。

LAST() 函数返回最后一个事件,Get Series API 应该根据文档保留实际的事件时间戳,但我对从这个 API 返回的结果有点困惑。我得到了多个结果(有时甚至没有按时间戳排序)并且必须自己找出最新的值。我还注意到查询结果实际上并没有反映最新的摄取值。如果我多次摄取该值,则仅在结果集中包含最新摄取的值。

是否有任何更直接或可靠的方法可以使用 Azure 时序见解获取时序的最后一个值?

标签: azureazure-timeseries-insights

解决方案


目前,获取最后一个已知值的最可靠方法是使用 AggregateSeries API。

您可以在计算最后一个事件属性和最后一个时间戳属性的变量中使用 last() 聚合。您必须在查询中提供搜索范围,因此您仍然必须“猜测”最新值何时出现。

一些选项是始终具有比您可能需要的更大的搜索范围(例如,如果传感器每天发送数据,您可以输入一周的搜索范围以确保安全)或使用可用性 API 获取时间范围和分布跨所有 TSID 的整个数据集,并将其用作搜索范围。请记住,具有较大的搜索范围会影响查询的性能。

下面是一个 LKV 查询示例:

"aggregateSeries": {

    "searchSpan": {

        "from": "2020-02-01T00:00:00.000Z",

        "to": "2020-02-07T00:00:00.000Z"

    },

    "timeSeriesId": [

        "motionsensor"

    ],

    "interval": "P30D",

    "inlineVariables": {

        "LastValue": {

            "kind": "aggregate",

            "aggregation": {

                "tsx": "last($event['motion_detected'].Bool)"

            }

        },

        "LastTimestamp": {

            "kind": "aggregate",

            "aggregation": {

                "tsx": "last($event.$ts)"

            }

        }

    },

    "projectedVariables": [

        "LastValue", 

        "LastTimestamp"

    ]

}

推荐阅读