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