0

ABだけを見たいこのテーブルがあります

ID     CODE       COUNT   
102    AB         7
101    AB         6
100    AC         23    //not important!!!!
99     AB         26
98     AB         1
97     AB         0
96     AB         50

各ステップの違いを数えたいが、場合によってはその間に

ケース1:値が前の値なしで突然50になった場合は、前の値として0を取ります。

ケース2が突然負になる場合は、前の値として0も取ります。

したがって、私の結果は次のようになります。

ID      COUNT   DIFFERENCE  
96      50      50      //CASE 1, take 0 as previous value
97       0       1
98       1      25
99      26       6      //CASE 2, take 0 instead of 26 as previous value
101      6       1

私が今持っているコードは次のとおりです。

http://sqlfiddle.com/#!2/98051/3

希望どおりに機能するように調整するにはどうすればよいですか?

敬具

ps:これが不明な場合は、質問してください。質問の改善に努めます。

4

2 に答える 2

0

この文脈で「突然」が何を意味するのかわかりませんが、おそらくこのようなものがあなたのために働くことができます...

SELECT a.id
     , a.code
     , a.count
     , b.count bcount
     , CASE WHEN a.count = 50 AND b.count IS NULL THEN 50
            WHEN a.count - b.count <= 0 THEN 0
            ELSE a.count - b.count
            END difference
  FROM 
     ( SELECT x.* 
            , COUNT(*) rank
         FROM some_table x
         JOIN some_table y
           ON y.code = x.code
          AND y.id <= x.id
        GROUP
           BY x.id
     ) a
  LEFT
  JOIN   
     ( SELECT x.* 
            , COUNT(*) rank
         FROM some_table x
         JOIN some_table y
           ON y.code = x.code
          AND y.id <= x.id
        GROUP
           BY x.id
     ) b
    ON b.code = a.code
   AND b.rank = a.rank -1;
于 2013-02-03T15:57:06.320 に答える
0

あなたが正確に何を達成しようとしているのか完全には理解していませんが、次のようなものが必要だと推測しています:

SET @previous_count:=0;

SELECT id, code, `count`, 
IF(`count` - @previous_count, `count`) as difference,
@previous_count:=`count` 
FROM table
于 2013-02-03T15:32:08.183 に答える