使用SQL Server在时间戳间隔中查找统计离群值

时间:2019-12-03 16:25:51

标签: sql sql-server tsql

我们在现场(各种客户站点)有一堆设备,这些设备会定期“回电”,可以在设备上配置,但默认为4小时。

我在SQL Server中有一个视图,该视图以时间顺序降序显示:

DeviceInstanceId uniqueidentifier not null
AccountId int not null
CheckinTimestamp datetimeoffset(7) not null
SoftwareVersion string not null

每次设备检入时,它将报告其ID和我们存储在SQL Server数据库中的当前软件版本。

其中一些设备处于不稳定的网络连接中,这显然会阻止它们正常运行。数据中心中还有很多管理员可以定期忘记它并更改防火墙/代理设置,从而意外阻止设备的出站通信。我们需要主动发现这种不良连接,以便在发现不满意的客户之前就可以开始调查问题了……因为即使问题肯定是在他们的99%上,他们还是会感觉到(就我们而言) ,正确)我们应该了解它并引起他们的注意,而不是相反。

我正在尝试一种查询所有不同的DeviceInstanceId的方法,这些87C92D22-6C31-4091-8985-AA6877AD9B40当前在正常签入间隔的150%时间内没有签入。例如,假设设备E117C276-9DF8-431F-A1D2-7EB7812A8350在最近的1000个签入中每4小时左右签入一次(给出或花费几秒钟)...但是最后一次签入仅略超过6次小时前。我想强调一下这些信息,以便与plt设备一起正常检查,该设备通常每2个小时检查一次,但是距离上一次签到已经超过3个小时了。

暴力破解似乎比较简单,遍历所有设备,检查两次签到之间的平均间隔,查看最后一次签到是什么,将其与当前时间进行比较,等等。。。其中,设备数量每天都在增加。我需要一个有效的查询来至少每隔一个小时快速生成此非通信设备列表...我只是无法想象如何编写该查询。

有人可以帮我吗?也许会指出正确的方向?谢谢。

1 个答案:

答案 0 :(得分:0)

  

我正在尝试提出一种方法来查询当前在正常签入间隔的150%时间内未签入的所有不同DeviceInstanceId。

我认为您可以做到:

select *
from (select DeviceInstanceId,
             datediff(second, min(CheckinTimestamp), max(CheckinTimestamp)) / nullif(count(*) - 1, 0) as avg_secs,
             max(CheckinTimestamp) as max_CheckinTimestamp
      from t
      group by DeviceInstanceId
     ) t
where max_CheckinTimestamp < dateadd(second, - avg_secs * 1.5, getdate());