【发布时间】:2020-09-25 06:54:08
【问题描述】:
以下是我想要完成的查询示例:
WITH IoTData AS
( SELECT *,
CAST(iothub.time AS datetime) AS time,
TRY_CAST(iothub.value AS float) AS value,
ref.AssetSignalTag AS assetsignaltag
FROM iothub TIMESTAMP BY iothub.time
JOIN masterdatasql ref
ON ref.[ConnectionString] = iothub.id
WHERE iothub.value IS NOT NULL
),
HISTORY AS (
SELECT assetsignaltag,
value,
COUNT(*) AS Count
CASE
WHEN value = 1 THEN 1
ELSE 0
END AS ConditionResult
FROM IoTData
GROUP BY assetsignaltag, SlidingWindow(minute, 30), value
)
SELECT
time,
value,
assetsignaltag,
HISTORY.ConditionResult,
HISTORY.Count
INTO eventhub
FROM IoTData
JOIN HISTORY
ON HISTORY.assetsignaltag = IoTData.assetsignaltag
AND DATEDIFF(minute, IoTData, HISTORY) = 10
WHERE HISTORY.ConditionResult = 1
AND MAX(HISTORY.Count) OVER (PARTITION BY IoTData.assetsignaltag LIMIT DURATION (minute, 10)) = 1
/* Here is where I run into issues, because I'm not sure how to grab the value of 'over last 10 minutes if there was only 1 value'.
Also tried AND HISTORY.Count = 1 which makes more sense to me since I'm already defining the time of 10 minutes in the DATEDIFF above, but I'm not sure that the datetime function does what I think it does.
*/
问题是这将在流分析语法中被接受,但不会起作用。我试图从本质上使“嘈杂”的数据点变得不那么嘈杂。我们并不关心它是否会在 2 分钟内翻转到 1 到 0 到 1 到 0 到 1,但是如果它翻转到 1 并保持 10 分钟,我们希望它进入 eventthub,这会触发警报.
让我知道我是否可以对此进行澄清,或者我是否应该特别尝试任何事情。
【问题讨论】:
-
你试过 ISFRIST 吗? docs.microsoft.com/en-us/stream-analytics-query/…
-
@silent 不会只是从 10 分钟窗口中获取第一个值而忽略后面是否有值吗?仅在 10 分钟内有 1 个条目进入数据点时才抓取
-
hm 可能更多的是 LAG docs.microsoft.com/en-us/stream-analytics-query/… 这允许您比较一个值与上次发送时相比是否发生了变化。这更适合你的情况吗?
-
@silent 这似乎更接近答案,但我有点困惑如何使语法对我有利。 LAG(IoTData.value,1,'ALERT') OVER (PARTITION BY IoTData.AssetSignalTag LIMIT DURATION(minute,10)) AS AlertResult 我不确定这是否像我认为的那样工作。似乎 LAG 正在寻找以前的值。只要该窗口中有值,它就会返回吗?如果没有,我可以发送一个触发值吗?我的目标是如果在同一个 10 分钟的滑动窗口中发生两个使用相同 assetssignaltag 的事件,则删除所有内容
-
LAG 查看您的 LIMIT 时间范围内的所有事件。 LAST 只看上一个事件docs.microsoft.com/en-us/stream-analytics-query/…
标签: azure azure-eventhub azure-stream-analytics