2013-02-02 19 views
0

我有这个表,我只是想看看ABCASE如果没有以前的值

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:如果你不清楚这个给你,请你和我将尽力改善我的问题

+0

是不是突然从26降到1? – hjpotter92

+0

是的,但它有时会在我的应用程序中出现 – Lazykiddy

+0

您能向我们展示所需的输出(现在它不会变得清晰,您的目标是什么)。 BTW。 “差异是[..]负面但大于0”没有任何意义。请详细说明。 – aefxx

回答

0

我不完全理解什么是你想实现准确,但我我猜你想是这样的:

SET @previous_count:=0; 

SELECT id, code, `count`, 
IF(`count` - @previous_count, `count`) as difference, 
@previous_count:=`count` 
FROM table 
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;