首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mysql递归减法和乘积值

Mysql递归减法和乘积值
EN

Stack Overflow用户
提问于 2014-03-29 01:12:03
回答 3查看 59关注 0票数 0

我不能用语言来解释我的问题,但举一个例子我可以清楚地展示出来:

我有一张这样的桌子:

代码语言:javascript
运行
复制
id    num   val
0     3     10
1     5     12
2     7     12
3     11    15

我要遍历所有的行,计算"num“的增加,然后用"val”值乘以这个差值。当我计算所有这些时,我想把这些结果加在一起。

这是数学方程式,我想在桌子上运行:

代码语言:javascript
运行
复制
Result = (3-0)*10 + (5-3)*12 + (7-5)*12 + (11-7)*15
138 = Result

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-29 01:29:54

您可以使用mysql变量,但仍然可以获得每个条目的一条记录。

代码语言:javascript
运行
复制
select
      @lastTotal := @lastTotal + ( (yt.num - @lastNum) * yt.val ) thisLineTotal,
      @lastNum := yt.num as saveForNextRow,
      yt.id
   from
      yourTable yt,
      ( select @lastTotal := 0,
               @lastNum := 0 ) sqlvars
   order by
      id

这将为您提供您想要确认的计算到每个记录的基础。

现在,要获得一个记录和一个列结果,您可以包装它,如

代码语言:javascript
运行
复制
select
      pq.thisLineTotal
   from
      (above entire query ) as pq
   order by 
      pq.id DESC
   limit 1
票数 2
EN

Stack Overflow用户

发布于 2014-03-29 01:44:10

这将给你总数。一定要按你想要的顺序订购--我已经按身份证订购了。

代码语言:javascript
运行
复制
SET @runtot:=0;
SET @prevval:=0;

select max(rt) as total FROM (
SELECT
   q.val,
   q.num,
   (@runtot := @runtot + (q.num- @prevval) * q.val) AS rt,
   (@prevval := q.num) AS pv
FROM thetable q
ORDER by ID) tot

如果要查看计算的详细信息,请省略外部选择如下:

代码语言:javascript
运行
复制
SET @runtot:=0;
SET @prevval:=0;

SELECT
   q.val,
   q.num,
   (@runtot := @runtot + (q.num- @prevval) * q.val) AS rt,
   (@prevval := q.num) AS pv
FROM thetable q
ORDER by ID

如果您的列值可能有负数,则使用max(rt)将不适用于总数。然后,您应该使用:

代码语言:javascript
运行
复制
SET @runtot:=0;
SET @prevval:=0;

select @runtot as total FROM (
SELECT
   q.val,
   q.num,
   (@runtot := @runtot + (q.num- @prevval) * q.val) AS rt,
   (@prevval := q.num) AS pv
    FROM thetable q
ORDER by ID) tot LIMIT 1
票数 0
EN

Stack Overflow用户

发布于 2014-03-29 01:50:30

假设ID是连续的,就像您的示例数据所建议的那样,只需将表连接到它自己:

代码语言:javascript
运行
复制
select sum((t1.num-ifnull(t2.num,0))*t1.val) YourValue
from YourTable t1
  left join YourTable t2
    on t2.id = t1.id - 1;

http://www.sqlfiddle.com/#!2/40b9f/12

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22725742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档