表结构
表名A 字段 ID 和 DT (时间)
表a内存储大量数据(上百万条)
如果项查询某时间段内的数据,一下就可以查出来上万条,现在想进行间隔查询,例如相邻两条数据时间间隔大于3分钟
我在网上查询了一下午,也没找到满意答案.如下方法就不要讲了(DATEDIFF ( mi , 起始时间, 数据时间) % 间隔值 = 0) 这个方法只能查询来两条数据时间间隔正好为间隔时间的数据,而我的数据时间间隔不是整数.
我查询的条件必须满足,两条数据间隔大于等于3分钟.
例如有如下简化数据数据,查询条件为相邻两条数据时间间隔大于3分钟取值,则1,2 满足,3 不满足,4和第2条间隔4分钟满足
ID DT
1 1:00
2 1:03
3 1:05
4 1:07
有没有办法在存储过程里面实现上诉功能?在程序代码里面就不用麻烦大家了.
表名A 字段 ID 和 DT (时间)
表a内存储大量数据(上百万条)
如果项查询某时间段内的数据,一下就可以查出来上万条,现在想进行间隔查询,例如相邻两条数据时间间隔大于3分钟
我在网上查询了一下午,也没找到满意答案.如下方法就不要讲了(DATEDIFF ( mi , 起始时间, 数据时间) % 间隔值 = 0) 这个方法只能查询来两条数据时间间隔正好为间隔时间的数据,而我的数据时间间隔不是整数.
我查询的条件必须满足,两条数据间隔大于等于3分钟.
例如有如下简化数据数据,查询条件为相邻两条数据时间间隔大于3分钟取值,则1,2 满足,3 不满足,4和第2条间隔4分钟满足
ID DT
1 1:00
2 1:03
3 1:05
4 1:07
有没有办法在存储过程里面实现上诉功能?在程序代码里面就不用麻烦大家了.
select m.* from
(select t.* , px = (select count(1) from tb where id < t.id) + 1 from tb t) m
(select t.* , px = (select count(1) from tb where id < t.id) + 1 from tb t) n
where m.id = n.id - 1 and datediff(mi ,m.dt,n.dt) >= 3
declare @start datetime, @stop datetime, @delta int
set @start = '2010-01-10 12:00' -- 查询的时间范围
set @stop = '2010-01-10 16:00'
set @delta = 100 -- 时间间隔declare @times table (id int, dt datetime)
insert into @times
select [id], [dt]
from [A]
where [dt]>@start and [dt]<@stopselect *
from @times a
where not exists (select 1 from @times b
where b.dt < a.dt
and a.dt > dateadd(second,@delta,b.dt)
)
DECLARE @Flag VARCHAR(MAX),@Count INT
SELECT @Flag='',@Count=0
;with CTE0 AS(
SELECT RowID=ROW_NUMBER() OVER(ORDER BY DT ASC),ID,DT FROM table
),
CTE1 AS (
SELECT RowID,ID,DT,DIFF=DATEDIFF(MI,(SELECT DT FROM CTE0 AS x WHERE x.RowID=a.RowID-1 ),DT) FROM CTE0 AS a
)
SELECT @Count=@Count+ISNULL(DIFF,0)
, @Flag=CASE WHEN @Count>=3 OR RowID=1 THEN @Flag+','+CONVERT(VARCHAR(20),ID) ELSE @Flag END
, @Count=CASE WHEN @Count>=3 THEN 0 ELSE @Count END
FROM CTE1
SELECT ID,DT FROM table WHERE CHARINDEX(','+CONVERT(VARCHAR(20),ID),@Flag)>0
关系到顺序的问题,sql不是很适合来处理此类问题.
建议LZ建一游标逐条数下来,进行比较,筛选.