0

以下はdata表です:

/* TableName:Data */
  id  |  speed
----------------
   1  |   3
   2  |   0
   3  |   0
   4  |   5
   5  |   6
   6  |   7
   7  |   0
   8  |   0
   9  |   0
  10  |   3
   N  |   2

結果を(ゼロ速度を繰り返さずに)取得し、移動の状態を指定したい; 例 :

最初の速度行がゼロの 場合、移動状態後の最初の行で速度がゼロの場合Remove it from resultに表示し、速度がゼロで ない場合は速度のゼロ値の後に 速度がゼロ値で繰り返される場合に設定し、次に設定しますstate=START/MOVE
state=STOP
Remove it from result
state=START

結果の例:

      /* Results */
  id  |  speed  | status
-------------------------
   1  |   3     |  START/MOVE
   2  |   0     |  STOP
   4  |   5     |  START
   5  |   6     |  MOVE
   6  |   7     |  MOVE
   7  |   0     |  STOP
  10  |   3     |  START
   N  |   2     |  MOVE
4

1 に答える 1

1
SELECT     a.*, 
           CASE WHEN @val IS NULL THEN @val:='START/MOVE'
                WHEN speed = 0 AND @val IN ('START/MOVE', 'START', 'MOVE') THEN @val:='STOP'
                WHEN speed > 0 AND @val = 'STOP' THEN @val:='START'
                WHEN speed > 0 AND @val IN ('START', 'MOVE') THEN @val:='MOVE'
           END AS status
FROM       (
           SELECT    a.*
           FROM      data a 
           LEFT JOIN (
                     SELECT MIN(id)-1 AS id, 0 AS speed
                     FROM   data 

                     UNION ALL

                     SELECT id, speed
                     FROM   data 
                     ) b ON a.id = b.id + 1 AND (a.speed,b.speed) IN ((0,0))
           WHERE     b.id IS NULL
           ) a
CROSS JOIN (SELECT @val:=NULL) val_init

テストされ、動作しています。

SQLFiddleデモを表示しますが、残念ながら、現在サイトがダウンしています。

于 2012-08-02T11:16:24.650 に答える