【问题标题】:SQL Query to aggregate DateDiff greater than given valueSQL查询聚合DateDiff大于给定值
【发布时间】:2010-01-25 19:42:44
【问题描述】:

我有一个用于设备“心跳”的日志记录表。我有这些网络设备每 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

建议?

【问题讨论】:

    标签: sql tsql datetime datediff


    【解决方案1】:

    试试这个:

    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
    

    【讨论】:

      猜你喜欢
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多