Sql server 需要按日期分组+;/-1秒

Sql server 需要按日期分组+;/-1秒,sql-server,tsql,Sql Server,Tsql,我试图寻找这个问题的答案,但找不到答案。如果我的搜索关键字不正确,很抱歉。 希望这是有意义的。 假设我有一个表a,其中包含这样的数据,这是由两台独立的机器(systemID a和B)存储的数据,从同一个系统收集错误代码 StartDateTime systemID HostID Error 01/01/17 13:49:11 A 1 6 01/01/17 13:49:11 B 1

我试图寻找这个问题的答案,但找不到答案。如果我的搜索关键字不正确,很抱歉。
希望这是有意义的。
假设我有一个表a,其中包含这样的数据,这是由两台独立的机器(systemID a和B)存储的数据,从同一个系统收集错误代码

StartDateTime           systemID    HostID   Error
01/01/17 13:49:11           A        1         6
01/01/17 13:49:11           B        1         6
01/01/17 13:53:11           A        2         5
01/01/17 13:53:12           B        2         5
01/01/17 13:53:13           A        1         6
01/01/17 13:53:13           B        1         6
我想按StartDateTime分组,所以有一个查询

SELECT [StartDateTime], [HostID],MAX([Error])
FROM A
GROUP BY [StartDateTime],[HostID]
除了第3行和第4行之外,其他行应该合并,但由于日期的舍入,显示为单独的条目,相差1秒

我无法仅通过systemID进行查询,因为可能只有一台机器获得错误


有没有一种方法可以在sql中按StartDateTime字段+/-1秒进行分组?

我确信有一种更简单的解决方案,这需要sql Server 2012+,但这应该可以做到

-- Sample data
DECLARE @A table (StartDateTime datetime, systemID char(1), HostID tinyint, Error tinyint)
INSERT @A  VALUES
('01/01/17 13:49:11','A',1,6),
('01/01/17 13:49:11','B',1,6),
('01/01/17 13:53:11','A',2,5),
('01/01/17 13:53:12','B',2,5),
('01/01/17 13:53:13','A',1,6),
('01/01/17 13:53:13','B',1,6);


-- solution    
SELECT
  HostID,
  startDateTime = 
  CASE 
    WHEN ABS(DATEDIFF(SECOND,startDateTime,Prev)) IN (0,1)
    THEN Prev ELSE StartDateTime
  END,
  Error = MAX(Error)
FROM
(
  SELECT *, 
    Prev = LAG(startDateTime,1,startDateTime) OVER (PARTITION BY HostID ORDER BY RN)
  FROM
  (
    SELECT
      [HostID],
      RN = ROW_NUMBER() OVER (PARTITION BY HostID ORDER BY [StartDateTime]),
      [StartDateTime],
      [Error]
    FROM @A
  ) prep
) prep
GROUP BY 
  HostID,
  CASE 
    WHEN ABS(DATEDIFF(SECOND,startDateTime,Prev)) IN (0,1) 
    THEN Prev ELSE StartDateTime
  END;
返回

HostID startDateTime           Error
------ ----------------------- -----
1      2017-01-01 13:49:11.000 6
1      2017-01-01 13:53:13.000 6
2      2017-01-01 13:53:11.000 5

分组是否总是意味着1-2、3-4、5-6、7-8、9-0?为什么(例如)第4行、第5行和第6行不分组?最后一行是什么意思?我马上就看到了一个大问题。假设有一系列记录,每个记录之间的间隔不超过5秒。在这种情况下,您如何定义组/岛?向我们展示如何根据上述6条记录组成组。有多少组?您确定这是SQL Server,因为它没有
LAST
函数吗?谢谢Alan,使用LAG是解决问题的诀窍。我的做法略有不同,但你为我指明了正确的方向