我试过寻找答案,但找不到答案。抱歉,如果我的搜索关键字不正确
希望这是有道理的。
假设我有一个包含数据的表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秒进行分组吗?
答案 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