我有用于设备“心跳”一个记录表。我的这些网络设备,办理入住手续/每10分钟服务器心跳。我们是想,当他们想念自己的计划入住时间统计。我有一个查询,可以做到这在每个装置的基础上,但我需要它在所有设备进行修改,以手柄。

心跳表看起来像这样:

CREATE TABLE [dbo].[DeviceHeartbeat](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [DeviceId] [int] NULL,
    [CheckinTime] [datetime] NULL,
    [Runtime] [int] NULL,
PRIMARY KEY CLUSTERED 
([Id] ASC)) ON [PRIMARY]

设备检查到服务器,服务器会将一行添加到该表中它的ID,该CheckinTime和器件的运行时(由设备发送的硬件值)。 查询我目前看起来是这样的:

WITH t AS
(
  SELECT Checkintime, rn = ROW_NUMBER() OVER (ORDER BY Checkintime)
  FROM DeviceHeartbeat
  WHERE DeviceId = 1112
),
x AS
(
  SELECT d = DATEDIFF(MINUTE, t1.Checkintime, t2.Checkintime)
  FROM t AS t1
  INNER JOIN t AS t2
  ON t1.rn = t2.rn - 1
),
y AS
(
  SELECT stats = CASE WHEN d < 10 THEN ' < 10 '
    WHEN d BETWEEN 10 AND 11 THEN '10 - 11 '
    WHEN d BETWEEN 11 AND 12 THEN '11 - 12 '
    ELSE '+12 ' END + ' minutes:'
  FROM x
)
SELECT stats, COUNT(*) FROM y GROUP BY stats;

此查询限于单个指定的设备。实施例的结果如下所示:

stats                  
----------------- ---- 
 < 10  minutes:   1536
10 - 11  minutes: 425
11 - 12  minutes: 952
+12  minutes:     160

在理想情况下,我只关注签入超过12分钟以上。所以,我是想是谁拥有签入超过12分钟,他们的罪名下令更大的设备的列表。这将让我看到上面有大于12分钟时检查,10倍或20的设备,提醒我问题的设备。 是这样的:

DeviceId   CheckinsOver12Mins
---------- -------------------
1112       160
1108       152
15         114
106        86

建议?

有帮助吗?

解决方案

尝试这种情况:

WITH t AS
(
  SELECT Checkintime, DeviceID, rn = ROW_NUMBER() OVER (ORDER BY DeviceID, Checkintime)
  FROM DeviceHeartbeat
),
x AS
(
  SELECT t1.deviceID, d = DATEDIFF(MINUTE, t1.Checkintime, t2.Checkintime)
  FROM t AS t1
  INNER JOIN t AS t2
  ON t1.rn = t2.rn - 1 and t1.DeviceID = t2.DeviceID
),
y AS
(
  SELECT deviceID
  FROM x
  WHERE d > 12
)
select deviceID, count(deviceID) as [Checkins over 12 mins] FROM y GROUP BY deviceID

注:没有测试数据 - 没有测试,可能有错别字

应当在y CTE可以去除和改变为使得一个较小的查询:

select deviceID, count(deviceID) as [Checkins over 12 mins] 
FROM x 
GROUP BY deviceID
HAVING d > 12
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top