表结构如下:Colldate value
2006-1-1  111
2006-1-2  222
2006-1-3  333
2006-1-4  444
2006-1-10 555
2006-1-20 666如果有100条记录,每条的时间相差都是一天,而有2条数据,他们时间相差10天,我认为这10天的是错误数据,我就取当前正确时间间隔为1天。同理,如果有200条数据,每2条之间相隔是10天,而有50条数据,每2条相隔1天,因为200>50,就取大多数的时间间隔作为标准间隔,就是将10天取出来。请问这样的sql语句应该怎么写?

解决方案 »

  1.   

    用游标肯定是可以实现的。大致代码如下:
    declare @colldate datetime
    declare @val      intdeclare @colldate_tmp datetime
    declare @val_tmp      intdeclare xx_cursor CURSOR
    FOR select * from tablename order by colldate
    OPEN xx_cursorFETCH NEXT FROM xx_cursor
    INTO @colldate_tmp, @val_tmp
    WHILE @@FETCH_STATUS = 0
    BEGIN
          FETCH NEXT FROM xx_cursor 
    INTO @colldate, @val
         
         // TODO...
         // 
         // 计算@colldate 与@colldate_tmp的diff值,可以放到一个临时表中
         // 表结构为diff日期间隔和int 计数两个字段。
         // 存在计数加1,不存在插入间隔值。
         //  遍历完成后取计数最大值即可。
         set @colldate_tmp = @colldate
           set @val_tmp = @val
    -- Get the next vendor.
    FETCH NEXT FROM xx_cursor 
    INTO @colldate, @val
    END 
      

  2.   

    我的意见:
    1.想要使用一条SQL完成这个语句怕是不可能的...
    2.楼上的说的用游标的方法可以实现,但是写的不正确
      

  3.   

    --建立测试环境create table table2
    (
    Colldate varchar(10),
    value int
    )insert into table2 select '2006-01-01', 111
    insert into table2 select '2006-01-02', 222
    insert into table2 select '2006-01-03', 333
    insert into table2 select '2006-01-04', 444
    insert into table2 select '2006-01-10', 555
    insert into table2 select '2006-01-20', 666--查询语句
    select top 1 xday,count(1) as daycount
    from
    (select t1.*,xday = isnull(datediff(day,(select max(Colldate) from table2 where Colldate < t1.Colldate),Colldate),0)
    from table2 t1
    )t3
    where xday <> 0
    group by xday
    order by daycount desc--注意:
    1.这样的语句只是查出最多的一条,如果101条日期中,前面50个间隔是1天,后面的50个间隔是2天,也就是说你需要的那个数据如果有重复的话,只能取出一条,因为有个top 1 
    2.如果你的Colldate 是字符格式的话最好把上面的语句用刀的Colldate 都改成convert(datetime,Colldate ,120)
      

  4.   

    --查询结果xday 是你需要的日期相隔天数,daycount 是他出现的次数
    ---------------------------
    xday    daycount
    1 3
    ---------------------------以上查询语句如果去掉top 1 ,查询结果
    -----------------------------------
    1 3
    6 1
    10 1
    -----------------------------------看到以上结果楼主应该知道这个语句的思路了吧
      

  5.   

    再说明一点:
    我写的语句要求楼主的数据Colldate的日期是递增的
    如果不是的话,这个语句就不行