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是解决问题的诀窍。我的做法略有不同,但你为我指明了正确的方向