【问题标题】:Average over some values, determined by entries from other messages某些值的平均值,由其他消息中的条目确定
【发布时间】:2021-11-01 16:27:55
【问题描述】:

我的流分析正在摄取不同类型的消息流。有些是type: telemetry,有些是type: flags。我需要计算一些遥测值的移动窗口的平均值,但只考虑那些前面带有值为 true 的标志消息的值。

换句话说:无论是否考虑遥测来计算平均值,标志消息都会打开/关闭。

我尝试了以下查询:

SELECT
    devId,
    type,
    AVG ("myValue") OVER ( LIMIT DURATION (second, 30) WHEN
        LAG (value) OVER (LIMIT DURATION(minute, 5) WHEN type='flag' and text='myValueFlag') = 1
    ) as 'myValueAvg'
    MAX("ts") as 'ts'
INTO "eventhub-output"
FROM "iothub-input" TIMESTAMP BY "ts"
WHERE type = 'telemetry'
GROUP BY devId, type, SlidingWindow(second, 30)

但我收到此错误消息:

在使用 GROUP BY 的查询中,分析函数既不能用于 GROUP BY 也不能用于 SELECT,除非它们是聚合函数的参数,例如 SUM(LAG(x) OVER(LIMIT DURATION(ss, 5 ))。

我不知道如何从这里开始。 documentation

LAG 不受 WHERE 子句中的谓词、JOIN 子句中的连接条件或当前查询的 GROUP BY 子句中的分组表达式的影响,因为它在这些子句之前进行评估。

所以我假设上面的查询应该可以工作。

【问题讨论】:

  • 您是否尝试过使用 WITH 分两步编写查询?它应该工作。我需要仔细检查文档 sn-p。
  • 我不知道该怎么做。我究竟会提取什么到 WITH 子句?

标签: azure azure-stream-analytics


【解决方案1】:

我终于让它工作了。诀窍是根本不使用AVG OVER 子句。相反,我在过滤相关数据点的子查询上使用了简单的AVG

WITH relevant_data AS (
    SELECT 
        devId, 
        myValue, 
        ts
    FROM "iothub-input" TIMESTAMP by "ts"
    WHERE myValue IS NOT NULL
    AND type = 'telemetry'
    AND LAG (value,1,1) OVER ( LIMIT DURATION(minute, 5) WHEN type='flag' and text='myValueFlag') = 1
)

SELECT 
    devId,
    AVG ( myValue ) as 'myValueAvg',
    MAX("ts") as 'ts'
FROM relevant_data
GROUP BY devId, SlidingWindow(second, 30)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多