SQL Server Sql查询以选择过去60秒的记录,并比较所选记录的温度,如果任何记录具有更高的值,则忽略

vhipe2zx  于 2023-02-07  发布在  其他
关注(0)|答案(1)|浏览(159)

我正在尝试消除从eventhub接收的数据中的数据异常,并通过Azure流分析仅将选定的数据发送到Azure函数,因为我正在编写一个SQL查询,需要一些帮助
要求:我需要收集过去60秒的数据,需要按ID分组并比较我在60秒内收到的记录,如果任何记录值远高于选定值,则忽略该记录(例如,我将收集过去60秒内的4条记录,如果数据为40 40 40 40 5。我们应删除5。示例2 - 20 20 20 500删除500。)
我的sql表将是这样的:

id  Temp    date    datetime
123 30  2023-01-01  2023-01-01 12:00:00
124 35  2023-01-01  2023-01-01 12:00:00
123 31  2023-01-01  2023-01-01 12:00:00
123 33  2023-01-01  2023-01-01 12:00:00
123 60  2023-01-01  2023-01-01 12:00:00
124 36  2023-01-01  2023-01-01 12:00:00
124 36  2023-01-01  2023-01-01 12:00:00
124 8   2023-01-01  2023-01-01 12:00:00
124 36  2023-01-01  2023-01-01 12:00:00

我需要排除不在其他记录范围内的记录

lx0bsm1f

lx0bsm1f1#

我将把比较的细节留给您,但是您可以使用CROSS APPLY来收集用于比较的数据。
比如:

SELECT *
FROM TemperatureData T
CROSS APPLY (
    SELECT AVG(T2.Temp * 1.0) AS PriorAvgTemp, COUNT(*) As PriorCount
    FROM TemperatureData T2
    WHERE T2.id = T.id
    AND T2.datetime >= DATEADD(second, -60, T.datetime)
    AND T2.datetime < T.datetime
) P
WHERE T.Temp BETWEEN P.PriorAvgTemp - 10 AND P.PriorAvgTemp + 10
--OR P.PriorCount < 3 -- Should we allow if there is insufficient prior data
--AND P.PriorCount >= 3 -- Should we omit if there is insufficient prior data

请确保在TemperatureData(id, datetime)上有索引。
如果您愿意接受最后N个值而不是时间范围,则窗口聚合计算可能更有效。

SELECT *
FROM (
    SELECT *,
        AVG(T.Temp * 1.0)
            OVER(PARTITION BY id ORDER BY datetime
                 ROWS BETWEEN 60 PRECEDING AND 1 PRECEDING)
            AS PriorAvgTemp,
        COUNT(*) 
            OVER(PARTITION BY id ORDER BY datetime
                 ROWS BETWEEN 60 PRECEDING AND 1 PRECEDING)
            AS PriorCount
    FROM TemperatureData T
) TT
WHERE TT.Temp BETWEEN TT.PriorAvgTemp - 10 AND TT.PriorAvgTemp + 10
--OR TT.PriorCount < 3 -- Should we allow if there is insufficient prior data
--AND TT.PriorCount >= 3 -- Should we omit if there is insufficient prior data

请注意:以上是未经测试的代码,可能需要一些语法修正和调试。如果你发现错误,请评论,我会更正后。

相关问题