我想从每10或15分钟间隔中只选择一条记录,但时间间隔可能不同,我找到了使用tsql解决我的问题的方法,但它的查询执行时间非常长,是否有其他方法可以最小化这个查询?
DECLARE @tb table(pks bigint)
DECLARE @stdt datetime
DECLARE @endt datetime
DECLARE @intervel int
SET @intervel = 10
DECLARE @pk_id bigint
SET @stdt = '2013-01-31 16:17:42.000'
SET @endt = '2013-01-31 16:46:41.000'
DECLARE @fstat int
DECLARE @c_Val bigint
DECLARE @cDate datetime
SET @fstat = 0
WHILE @fstat = 0
begin
select TOP 1 @pk_id=spliter_2.spliter2_pk_id, @cDate=dt from spliter_2 where dt between @stdt AND @endt ORDER BY dt
set @stdt = (dateadd(minute, @intervel, @cDate))
IF @c_Val=@pk_id
begin
set @fstat = -2
end
else
begin
insert INTO @tb(pks)VALUES(@pk_id)
set @c_Val=@pk_id
end
end
SELECT spliter2_pk_id, packet_count, dt FROM spliter_2 where spliter2_pk_id IN (SELECT pks from @tb)
注意,在上表spliter_2中,字段dt
为datetime
,spliter2_pk_id
为bigint
。
这是我的表格行
spliter2_pk_id packet_count dt
15260 00049 2013-01-31 16:17:42.000
15273 00062 2013-01-31 16:18:43.000
15285 00074 2013-01-31 16:19:43.000
15295 00084 2013-01-31 16:20:43.000
15306 00096 2013-01-31 16:21:44.000
15309 00C55 2013-01-31 16:43:02.000
15322 00C68 2013-01-31 16:44:04.000
15328 00C79 2013-01-31 16:45:07.000
15338 00C99 2013-01-31 16:46:33.000
当@intervel = 9
时,这是我的预期结果spliter2_pk_id packet_count dt
15260 00049 2013-01-31 16:17:42.000
15309 00C55 2013-01-31 16:43:02.000