表结构
表名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
有没有办法在存储过程里面实现上诉功能?在程序代码里面就不用麻烦大家了.

解决方案 »

  1.   

    --假设ID连续.select m.* from tb m, tb n where m.id = n.id - 1 and datediff(mi ,m.dt,n.dt) >= 3--假设ID不连续.
    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
      

  2.   


    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)
        )
      

  3.   

    要一句SQL到位,思考良久,没有想到解决方案,如果CTE支持子查询引用的话,或许可以用CTE递归解决(但不支持),下边是一种方案:
    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
      

  4.   

    这样的问题,记录时间密集时,存在要去掉那些记录的问题,从不同的记录开始,去掉的记录不同.
    关系到顺序的问题,sql不是很适合来处理此类问题.
    建议LZ建一游标逐条数下来,进行比较,筛选.
      

  5.   

    刚才分析了一下6楼代码,应该不对,因为exits里面 没办法判断比较顺序正确.算了 我还是在代码里面实现吧,结贴散分,给为给建议的都有分.谢谢各位热心朋友.