流分析,如果一次发生就可以获取价值

问题描述

以下是我要完成的查询示例:

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