如何计算每一行之间的差异并返回总和以及如何在程序中写入它。(我使用 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;
答案 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;