计算SQL中两行之间的差异

时间:2015-09-02 07:04:50

标签: mysql

我有一个SQL表,一行是特定日期的收入,我想在表中添加一个新列,该值是特定日期和特定日期之间的增量(可能是正数或负数)收入前一天,并想知道如何通过SQL实现?

这是一个例子,

原始表,

...
Day1 100
Day2 200
Day3 150
...

新表(在末尾添加增量列,对于第一列,可以指定零),

Day1 100 0
Day2 200 100
Day3 150 -50

我正在使用MySQL / MySQL Workbench。

提前谢谢, 林

3 个答案:

答案 0 :(得分:3)

如果您可以稍微重新排序列,那么这样的事情很容易理解:

SET @prev := 0;
SELECT day, revenue - @prev AS diff, @prev := revenue AS revenue
FROM revenue ORDER BY day ASC;

诀窍是我们计算与前一个的差异,然后将前一个设置为当前并在一步中将其显示为当前。

请注意,这取决于顺序是否正确,因为计算是在返回行期间完成的,因此您需要确保使用ORDER BY子句以正确的顺序返回日期。

答案 1 :(得分:1)

SELECT a.day, a.revenue , a.revenue-COALESCE(b.revenue,0) as previous_day_rev 
FROM DailyRevenue a 
LEFT JOIN DailyRevenue b on a.day=b.day-1

查询假设每天在表中有一条记录。如果每天可能有超过1行,则需要创建一个视图,该视图总结了按日分组的所有日期。

答案 2 :(得分:1)

尝试;

select 
    t.date_col, t.val_col,
    case when t1.val_col is null then 0
    else t.val_col - t1.val_col end diff
from (
    select t.* , @r := @r + 1 lev
    from tbl t,
    (select @r := 0) r
    order by t.date_col
) t
left join (
    select t.* , @r1 := @r1 + 1 lev
    from tbl t,
    (select @r1 := 1) r
    order by t.date_col 
) t1
on t.lev = t1.lev

即使存在missing date

,也会计算值差异