问题描述
以下是我要完成的查询示例:
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,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分钟,我们希望它进入eventhub,从而触发警报
让我知道我是否可以对此进行澄清,或者是否应该尝试任何特别的事情。
解决方法
我可能不完全了解您要执行的计算,但似乎可以跳过联接,而只需使用LAG。
“历史记录”步骤创建一个“针对IoTData中的每个事件,回顾30分钟并计数每个资产ignaltag的事件数和1或0值”的流。
如果您只想在过去10分钟内事件数恰好为1时获得此类结果,则可以:
SELECT *
FROM HISTORY
WHERE Count() OVER (LIMIT DURATION(minute,10)) = 1