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

时间:2018-04-10 11:07:01

标签: sql-server tsql

我试过寻找答案,但找不到答案。抱歉,如果我的搜索关键字不正确 希望这是有道理的。
假设我有一个包含数据的表A,它是由2台独立机器(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

我想要GROUP BY StartDateTime,所以有一个查询

SELECT [StartDateTime], [HostID],MAX([Error])
FROM A
GROUP BY [StartDateTime],[HostID]

除第3行和第4行外,哪些工作应合并,但由于日期的舍入显示为1秒不同的单独条目。

我不能仅通过systemID查询,因为它可能只有一台机器获得错误。

我可以通过StartDateTime字段在sql中按+/- 1秒进行分组吗?

1 个答案:

答案 0 :(得分:0)

我确定有一个更简单的解决方案,这将需要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