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 >10 THEN 1 ELSE 0 END) cnt 
         FROM    maco a LEFT JOIN maco b ON a.rowid = b.rowid + 1
         --left join L_Vehicle v
          --on a.VehicleID=v.ID
          where a.VehicleID='辽A74897'  
     
         and a.date between convert(datetime,'2011-01-22 14:31:16',120) and convert(datetime,'2011-01-22 18:01:01',120)
         GROUP BY a.vehicleid我这样写怎么执行效率很低呢?   我这表的数据有2150万条,怎么改能效率快点?麻烦各位大侠了

解决方案 »

  1.   

    意思是这样的  表中有个字段叫做车速也就是carspeed字段, 求的是下一条减上一条大于10的总次数
      

  2.   

    把CTE改為臨時表
    在rowID加上索引convert(datetime,'2011-01-22 14:31:16',120)--直接用不需要轉換'2011-01-22 14:31:16'
      

  3.   

    --1.第一种
    LEFT JOIN maco b 换成 INNER JOIN maco b
      

  4.   

    1.把*号换成需要的字段。2.把left join 换成inner join 。3.不要使用between 格式的,换成两个和时间比较的方式,字符串不需要转换成时间格式
      

  5.   

    --2.第二种
    --#1. 数据存入临时表
    SELECT VehicleID, carspeed, flag = null into #temp FROM #
    WHERE  VehicleID = '辽A74897'
    AND [DATE] BETWEEN '2011-01-22 14:31:16' AND '2011-01-22 18:01:01'--#2. 设置cnt的值
    declare @StartCarspeed int, @counter int
    select top(1) @StartCarspeed = carspeed, @counter = 0 from #tempupdate #
    set @counter = @counter + (case when carspeed - @StartCarspeed > 10 then 1 else 0 end)select cnt = @counter
    /*
    cnt
    3
    */
      

  6.   

    数据如下:
    --DATA
    create table #
    (
    vehicleid nvarchar(100),
    carspeed int,
    [date] datetime
    )
    insert #
    select '辽A74897', 10, '2011-01-22 14:31:16' union all
    select '辽A74897', 12, '2011-01-22 15:31:16' union all
    select '辽A74897', 30, '2011-01-22 16:31:16' union all
    select '辽A74897', 50, '2011-01-22 17:31:16' union all
    select '辽A74897', 80, '2011-01-22 18:01:01'
      

  7.   

    呵呵,临时表可以省了^^
    declare @StartCarspeed int, @counter int
    select top(1) @StartCarspeed = carspeed, @counter = 0 from #update #
    set @counter = @counter + (case when carspeed - @StartCarspeed > 10 then 1 else 0 end)
    WHERE  VehicleID = '辽A74897'
    AND [DATE] BETWEEN '2011-01-22 14:31:16' AND '2011-01-22 18:01:01'select cnt = @counter
      

  8.   

    wwwwgou
        #应该是代表我这个真实表吧,但是你后面又update了这# 不是把真实表也改了?
      

  9.   

    IF object_id('Tempdb..#1') IS NOT NULL
    DROP TABLE #1
    SELECT ROW_NUMBER() OVER ( ORDER BY vehicleid,date ) AS rowid,* 
    INTO #1
    FROM TB_VDRDATA
    ORDER BY dateCREATE INDEX PK_#1_rowid ON #1(rowid)
    CREATE CLUSTERED INDEX IX_#1_date ON #1(date)  SELECT a.vehicleid ,
      SUM(CASE WHEN a.carspeed - b.carspeed >10 THEN 1 ELSE 0 END) cnt 
      FROM #1 a LEFT JOIN #1 b ON a.rowid = b.rowid + 1
      --left join L_Vehicle v
      --on a.VehicleID=v.ID
      where a.VehicleID='辽A74897'  
       
      and a.date between '2011-01-22 14:31:16' and '2011-01-22 18:01:01'
      GROUP BY a.vehicleid這樣試試
      

  10.   

    CTE里先做条件限制然后再join算结果呢?;with CTE as (
    SELECT ROW_NUMBER() OVER ( ORDER BY vehicleid,date ) AS rowid,* FROM TB_VDRDATA
    where VehicleID='辽A74897'  
    and date between '2011-01-22 14:31:16' and '2011-01-22 18:01:01'
    )
    SELECT a.vehicleid ,SUM(CASE WHEN a.carspeed - b.carspeed >10 THEN 1 ELSE 0 END) cnt 
      FROM CTE a inner JOIN CTE b ON a.rowid = b.rowid + 1
      

  11.   

    虽然是update语句,但是未对字段进行操作,只对变量进行了操作,所以没问题。
      

  12.   

    我继续问下啊  wwwwgoudeclare @StartCarspeed int, @counter int
    select top(1) @StartCarspeed = carspeed, @counter = 0 from #update #
    set @counter = @counter + (case when carspeed - @StartCarspeed > 10 then 1 else 0 end)
    WHERE  VehicleID = '辽A74897'
    AND [DATE] BETWEEN '2011-01-22 14:31:16' AND '2011-01-22 18:01:01'select cnt = @counter
    这个语句我执行起来有问题啊