select 间隔至少 1 分钟后记录
select record after interval of at least 1 minute
我有一个应用程序,如果数据包健康,它会在大约 1 秒后记录数据,这意味着无法保证记录。现在客户端只想看到间隔至少1分钟的日志数据。
例如,这是示例模式和数据
declare @mytable as table(ID int, tm DATETIME, Val int)
insert into @mytable values
(1, convert(DATETIME, N'2018-12-24 17:45:25.000', 21), 1),
(2, convert(DATETIME, N'2018-12-24 17:45:35.000', 21), 2),
(3, convert(DATETIME, N'2018-12-24 17:45:55.000', 21), 1),
(4, convert(DATETIME, N'2018-12-24 17:46:05.000', 21), 5),
(5, convert(DATETIME, N'2018-12-24 17:47:25.000', 21), 2),
(6, convert(DATETIME, N'2018-12-24 17:47:55.000', 21), 7),
(7, convert(DATETIME, N'2018-12-24 17:48:25.000', 21), 9),
(8, convert(DATETIME, N'2018-12-24 17:48:50.000', 21), 1),
(9, convert(DATETIME, N'2018-12-24 17:49:25.000', 21), 1),
(10, convert(DATETIME, N'2018-12-24 17:50:05.000', 21), 5),
(11, convert(DATETIME, N'2018-12-24 17:50:50.000', 21), 4),
(12, convert(DATETIME, N'2018-12-24 17:51:25.000', 21), 8),
(13, convert(DATETIME, N'2018-12-24 17:55:25.000', 21), 4),
(14, convert(DATETIME, N'2018-12-24 17:56:58.000', 21), 4),
(15, convert(DATETIME, N'2018-12-24 17:58:15.000', 21), 5),
(16, convert(DATETIME, N'2018-12-24 18:10:25.000', 21), 8);
输出应该是
1, convert(DATETIME, N'2018-12-24 17:45:25.000', 21), 1
5, convert(DATETIME, N'2018-12-24 17:47:25.000', 21), 2
7, convert(DATETIME, N'2018-12-24 17:48:25.000', 21), 9
9, convert(DATETIME, N'2018-12-24 17:49:25.000', 21), 1
11, convert(DATETIME, N'2018-12-24 17:50:50.000', 21), 4
13, convert(DATETIME, N'2018-12-24 17:55:25.000', 21), 4
14, convert(DATETIME, N'2018-12-24 17:56:58.000', 21), 4
15, convert(DATETIME, N'2018-12-24 17:58:15.000', 21), 5
16, convert(DATETIME, N'2018-12-24 18:10:25.000', 21), 8
这里,在一次合格入场后,下一次入场至少间隔1分钟。但是,我必须记录所有健康条目,因为在其他一些过程中我必须 return 所有记录。所以在记录期间跳过不是一种选择。
另外,我知道我可以使用 cursor
来实现它,但考虑到数据量,这不是一个可接受的解决方案。
使用递归通用table表达式:
;WITH CTE (Id, tm, val)
AS
(
SELECT TOP 1 *
FROM @mytable m
WHERE m.ID = 1
UNION ALL
SELECT
p.Id,
p.tm,
p.val
FROM
(
SELECT
m.*,
ROW_NUMBER() OVER(ORDER BY c.Id) AS row_num
FROM CTE c
INNER JOIN @mytable m ON c.Id < m.ID AND DATEADD(MINUTE, 1, c.tm) <= m.tm
) AS p
WHERE p.row_num = 1
)
SELECT *
FROM CTE c
Id tm val
----------- ----------------------- -----------
1 2018-12-24 17:45:25.000 1
5 2018-12-24 17:47:25.000 2
7 2018-12-24 17:48:25.000 9
9 2018-12-24 17:49:25.000 1
11 2018-12-24 17:50:50.000 4
13 2018-12-24 17:55:25.000 4
14 2018-12-24 17:56:58.000 4
15 2018-12-24 17:58:15.000 5
16 2018-12-24 18:10:25.000 8
但是,我不确定此解决方案是否适用于包含许多记录的大型 table。也许,在日志 table.
中插入后,您需要某种 post 处理
我有一个应用程序,如果数据包健康,它会在大约 1 秒后记录数据,这意味着无法保证记录。现在客户端只想看到间隔至少1分钟的日志数据。 例如,这是示例模式和数据
declare @mytable as table(ID int, tm DATETIME, Val int)
insert into @mytable values
(1, convert(DATETIME, N'2018-12-24 17:45:25.000', 21), 1),
(2, convert(DATETIME, N'2018-12-24 17:45:35.000', 21), 2),
(3, convert(DATETIME, N'2018-12-24 17:45:55.000', 21), 1),
(4, convert(DATETIME, N'2018-12-24 17:46:05.000', 21), 5),
(5, convert(DATETIME, N'2018-12-24 17:47:25.000', 21), 2),
(6, convert(DATETIME, N'2018-12-24 17:47:55.000', 21), 7),
(7, convert(DATETIME, N'2018-12-24 17:48:25.000', 21), 9),
(8, convert(DATETIME, N'2018-12-24 17:48:50.000', 21), 1),
(9, convert(DATETIME, N'2018-12-24 17:49:25.000', 21), 1),
(10, convert(DATETIME, N'2018-12-24 17:50:05.000', 21), 5),
(11, convert(DATETIME, N'2018-12-24 17:50:50.000', 21), 4),
(12, convert(DATETIME, N'2018-12-24 17:51:25.000', 21), 8),
(13, convert(DATETIME, N'2018-12-24 17:55:25.000', 21), 4),
(14, convert(DATETIME, N'2018-12-24 17:56:58.000', 21), 4),
(15, convert(DATETIME, N'2018-12-24 17:58:15.000', 21), 5),
(16, convert(DATETIME, N'2018-12-24 18:10:25.000', 21), 8);
输出应该是
1, convert(DATETIME, N'2018-12-24 17:45:25.000', 21), 1
5, convert(DATETIME, N'2018-12-24 17:47:25.000', 21), 2
7, convert(DATETIME, N'2018-12-24 17:48:25.000', 21), 9
9, convert(DATETIME, N'2018-12-24 17:49:25.000', 21), 1
11, convert(DATETIME, N'2018-12-24 17:50:50.000', 21), 4
13, convert(DATETIME, N'2018-12-24 17:55:25.000', 21), 4
14, convert(DATETIME, N'2018-12-24 17:56:58.000', 21), 4
15, convert(DATETIME, N'2018-12-24 17:58:15.000', 21), 5
16, convert(DATETIME, N'2018-12-24 18:10:25.000', 21), 8
这里,在一次合格入场后,下一次入场至少间隔1分钟。但是,我必须记录所有健康条目,因为在其他一些过程中我必须 return 所有记录。所以在记录期间跳过不是一种选择。
另外,我知道我可以使用 cursor
来实现它,但考虑到数据量,这不是一个可接受的解决方案。
使用递归通用table表达式:
;WITH CTE (Id, tm, val)
AS
(
SELECT TOP 1 *
FROM @mytable m
WHERE m.ID = 1
UNION ALL
SELECT
p.Id,
p.tm,
p.val
FROM
(
SELECT
m.*,
ROW_NUMBER() OVER(ORDER BY c.Id) AS row_num
FROM CTE c
INNER JOIN @mytable m ON c.Id < m.ID AND DATEADD(MINUTE, 1, c.tm) <= m.tm
) AS p
WHERE p.row_num = 1
)
SELECT *
FROM CTE c
Id tm val
----------- ----------------------- -----------
1 2018-12-24 17:45:25.000 1
5 2018-12-24 17:47:25.000 2
7 2018-12-24 17:48:25.000 9
9 2018-12-24 17:49:25.000 1
11 2018-12-24 17:50:50.000 4
13 2018-12-24 17:55:25.000 4
14 2018-12-24 17:56:58.000 4
15 2018-12-24 17:58:15.000 5
16 2018-12-24 18:10:25.000 8
但是,我不确定此解决方案是否适用于包含许多记录的大型 table。也许,在日志 table.
中插入后,您需要某种 post 处理