计算mysql中行之间差异的总和

时间:2015-04-21 17:21:03

标签: mysql

如何计算每一行之间的差异并返回总和以及如何在程序中写入它。(我使用 mysql

(id列中会有间隙)

id --- session --- value
1.........3..........15
4.........3...........5
7.........3...........8
10........3..........13
11........3...........9

从id.1到id.4,差异是 10
从id.2到id.3,差异是 3
从id.3到id.4,差异是 5
从id.4到id.5,差异是 4
总和= 22

这就是我想出的:(并且是完全错误的)

SET @oldV = 0;

SELECT SUM(table.x)
FROM(
    SELECT @oldV := value AND IF(value > @oldV, @x:=(value - @oldV), @x:=(@oldV - value)) x
    FROM TheTable WHERE session = 3 ORDER BY id) table;

4 个答案:

答案 0 :(得分:3)

根据您的示例,您似乎在计算行之间的绝对差异。您可以使用join语句执行此操作。尝试以下内容:

select a.id,b.id,abs(a.value - b.value) as dif
from UserData as a 
inner join
UserData as b
on a.id = b.id - 1

然后一旦你有了差异,你可以做一笔钱。如果id中存在间隙,请创建一个没有间隙的新col ROWNUMBER,然后使用它而不是id作为您的on语句

答案 1 :(得分:1)

http://sqlfiddle.com/#!9/c4573/5

SELECT *, 
   IF(@prev IS NULL,0, @diff := ABS(`value`-@prev)),
      @prev:=`value`,
      @total:=IF(@total IS NULL,0,@total)+@diff
FROM table1
ORDER BY id

答案 2 :(得分:1)

有很多方法可以获得指定的结果。

一种可能性(特定于MySQL)是使用用户定义的变量来存储"值"从上一行开始,您可以将其与"值"进行比较。从当前行开始。

注意:MySQL用户定义变量在如下所示的语句中的行为是未定义的。 MySQL参考手册根据这样的上下文中的用户定义变量的行为进行警告。但是......我们确实在MySQL 5.1和5.5中观察到可重复的一致行为。

SELECT SUM(d.diff) AS tot_diff
  FROM ( SELECT ABS(t.`value`-@pvalue) AS diff
              , @pvalue := t.`value`
           FROM mytable t
          CROSS
           JOIN ( SELECT @pvalue := NULL ) i
          ORDER BY t.id
       ) d

请注意,初始化用户定义的变量很重要,因为变量会持续存在于会话中,而不仅仅是语句。这就是我们在内联视图中包含初始化的原因(派生表 i )。或者,我们可以在运行查询之前运行单独的SET @pvalue := NULL;语句。

答案 3 :(得分:1)

我不太喜欢它,但它似乎有效。

SELECT 
   SUM(
       ABS(t1.num - t2.num)
   ) AS sumofdiffs
   FROM sumdiff AS t1 
   JOIN sumdiff AS t2 
      ON(
          (SELECT MIN(id) FROM sumdiff AS t3 WHERE t3.id > t1.id) = t2.id
      )
;

找到另一种方式。仅使用子查询,没有连接。它仍然很慢。但是应该比第一个查询更好。

SELECT 
    SUM( 
        ABS( t1.num - 
            (SELECT num FROM sumdiff WHERE id > t1.id ORDER BY id ASC LIMIT 1 ) 
        )
    ) AS summofdiffs
FROM sumdiff AS t1;

SQLFiddle