车牌        时间              车速          保持秒数
  1    2011-01-13 11:20:30      50             3
  1    2011-01-13 11:20:33      63             5
  1    2011-01-13 11:20:38      78             6
  1    2011-01-13 12:20:44      62             7
  1    2011-01-13 12:20:51      75             6
  1    2011-01-13 12:20:57      90             5规定是1秒钟内速度增加超过12公里/小时就算急加速
现在每条记录就相当于每秒的记录
在连续时间类2条记录的差大于12的话都算为一次急加速
按这要求上面的数据应该得到急加速为2次
现在要求的东西是急加速的总次数
以及得到车牌,开始时间,开始速度(KM/H),结束时间,结束速度(KM/H),平均加速度(KM/H/S) 
开始时间就是date字段的值
结束时间就是开始时间加上这一次急加速保持秒数的累加
下面给出表和一点测试数据
create table TB_VDRDATA
(
    carid int,--------车牌
    carspeed int,---------车速
    data  datetime,----------时间
    bcms float------------保持秒数
)
insert into TB_Vdrdata values(1,'50','2011-01-13 11:20:30','3')
insert into TB_Vdrdata values(1,'63','2011-01-13 11:20:33 ','5')
insert into TB_Vdrdata values(1,'78','2011-01-13 11:20:38','6')
insert into TB_Vdrdata values(1,'62','2011-01-13 12:20:44','7')
insert into TB_Vdrdata values(1,'75','2011-01-13 12:20:51','6')
insert into TB_Vdrdata values(1,'90','2011-01-13 12:20:57','5')

解决方案 »

  1.   


    ;WITH    maco
              AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY data ) AS rowid ,
                            *
                   FROM     TB_VDRDATA
                 )
        SELECT  a.carid ,
                a.carspeed - b.carspeed 加速
        FROM    maco a
                LEFT JOIN maco b ON a.rowid = b.rowid + 1
    /*
    carid       加速
    ----------- -----------
    1           NULL
    1           13
    1           15
    1           -16
    1           13
    1           15
    */
    --分明是加速了4次吗?
      

  2.   


    ;WITH    maco
              AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY data ) AS rowid ,
                            *
                   FROM     TB_VDRDATA
                 )
        SELECT  a.carid ,
                SUM(CASE WHEN a.carspeed - b.carspeed > 12 THEN 1
                         ELSE 0
                    END) 加速次数
        FROM    maco a
                LEFT JOIN maco b ON a.rowid = b.rowid + 1
        GROUP BY a.carid
               
    /*
    carid       加速次数
    ----------- -----------
    1           4
    */
      

  3.   


    ;WITH    maco
              AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY data ) AS rowid ,
                            *
                   FROM     TB_VDRDATA
                 )
        SELECT  a.carid ,
                CASE WHEN a.carspeed - b.carspeed > 12 THEN 1
                         ELSE 0
                    END AS col1 INTO #t
        FROM    maco a
                LEFT JOIN maco b ON a.rowid = b.rowid + 1
     
                
                SELECT * FROM #T 
       
                DROP TABLE #t
    /*
    carid       col1
    ----------- -----------
    1           0
    1           1
    1           1
    1           0
    1           1
    1           1
    */加了个临时表,可以做连续统计
      

  4.   


    ;WITH    maco
              AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY data ) AS rowid ,
                            *
                   FROM     TB_VDRDATA
                 )
        SELECT  a.carid ,
                CASE WHEN a.carspeed - b.carspeed > 12 THEN 1
                     ELSE 0
                END AS col1
        INTO    #t
        FROM    maco a
                LEFT JOIN maco b ON a.rowid = b.rowid + 1
    DECLARE @price INT ;
    SET @price = 0
    UPDATE  #T
    SET     @price = col1 = CASE WHEN col1 = 1
                                      AND @price = 0 THEN 1
                                 ELSE 0
                            END
    SELECT  carid ,
            SUM(col1) AS 加速次数
    FROM    #T 
    GROUP BY carid
    DROP TABLE #t
    /*
    carid       加速次数
    ----------- -----------
    1           2
    */
      

  5.   

    哦 知道了  
    我再问下 
    怎么得到车牌,开始时间,开始速度(KM/H),结束时间,结束速度(KM/H),平均加速度(KM/H/S)  
    开始时间就是date字段的值
    结束时间就是开始时间加上这一次急加速保持秒数的累加
      

  6.   

    上面我想错了 maco_wang第二次给的SQL是符合要求的
    总次数是出来了
    可以现在需求又加上了一个
     
    要得到每辆车每一次急加速的
    车牌,开始时间,开始速度(KM/H),结束时间,结束速度(KM/H),平均加速度(KM/H/S)   
    开始时间就是date字段的值
    结束时间就是开始时间加上这一次急加速保持秒数的累加请maco_wang在看看,我星期天在家里琢磨了半天没出来,家里没网没法发问。
      

  7.   

    maco_wang大哥
    WITH    maco
              AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY data ) AS rowid ,
                            *
                   FROM     TB_VDRDATA
                 )
        SELECT  a.carid ,
                SUM(CASE WHEN a.carspeed - b.carspeed > 12 THEN 1
                         ELSE 0
                    END) 加速次数
        FROM    maco a
                LEFT JOIN maco b ON a.rowid = b.rowid + 1
        GROUP BY a.carid
    这个是你写的 我现在改了下不知道怎么是不是正确
    WITH    maco AS ( SELECT   ROW_NUMBER() OVER (ORDER BY vehicleid,date ) AS rowid,* FROM     TB_VDRDATA)
        SELECT  a.vehicleid ,SUM(CASE WHEN a.carspeed - b.carspeed > 12 THEN 1 ELSE 0 END) cnt
        FROM    maco a LEFT JOIN maco b ON a.rowid = b.rowid + 1 
        where a.date between '2010-12-20 11:30:00' and '2010-12-29 11:30:00'
    GROUP BY a.vehicleid我只是在order by中加了vehicleid字段也就是车牌字段 他的数据就会少很多 不知道回事 
      

  8.   

    谢谢maco_wang大哥
      我刚刚琢磨出来了