情况什么时候没有以前的价值

时间:2013-02-02 09:53:01

标签: mysql

我有这张桌子,我只想看看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:如果您不清楚,请询问,我会尝试改进我的问题

2 个答案:

答案 0 :(得分:0)

我不完全明白你想要完成什么,但我猜你想要这样的东西:

SET @previous_count:=0;

SELECT id, code, `count`, 
IF(`count` - @previous_count, `count`) as difference,
@previous_count:=`count` 
FROM table

答案 1 :(得分: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;