我的流分析正在摄入不同类型的消息流。一些是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查询中,分析函数既不能在GROUP BY中使用,也不能在SELECT中使用,除非它们是聚合函数的参数,例如SUM(滞后(X)超过(限制持续时间(ss,5)。
我不知道怎么从这里开始。文档说
延迟不受WHERE子句中的谓词、join子句中的联接条件或当前查询的GROUP子句中的分组表达式的影响,因为它是在这些子句之前计算的。
因此,我假设上面的查询应该可以工作。
发布于 2021-09-06 12:04:24
我终于开始工作了。诀窍是根本不使用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)
https://stackoverflow.com/questions/69043072
复制相似问题