首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚合DateDiff大于给定值的SQL查询

聚合DateDiff大于给定值的SQL查询
EN

Stack Overflow用户
提问于 2010-01-26 03:42:45
回答 1查看 1.6K关注 0票数 1

我有一个用于设备“心跳”的日志表。我有这些网络设备,它们每10分钟向服务器发送一次签到/心跳信号。我们需要统计他们什么时候错过了预定的签到时间。我有一个查询,可以在每个设备的基础上做到这一点,但我需要修改它来处理所有设备。

心跳表如下所示:

代码语言:javascript
复制
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和设备的运行时(由设备发送的硬件值)。我当前使用的查询如下所示:

代码语言:javascript
复制
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;

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

代码语言:javascript
复制
stats                  
----------------- ---- 
 < 10  minutes:   1536
10 - 11  minutes: 425
11 - 12  minutes: 952
+12  minutes:     160

理想情况下,我只关心超过12分钟的签到。所以,我想要的是一份签到时间超过12分钟的设备列表,按设备数量排序。这将允许我查看签到时间超过12分钟的前10或20个设备,提醒我有问题的设备。类似于:

代码语言:javascript
复制
DeviceId   CheckinsOver12Mins
---------- -------------------
1112       160
1108       152
15         114
106        86

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-26 03:51:51

试试这个:

代码语言:javascript
复制
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并将其更改为更小的查询:

代码语言:javascript
复制
select deviceID, count(deviceID) as [Checkins over 12 mins] 
FROM x 
GROUP BY deviceID
HAVING d > 12
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2135075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档