我有一个SQL表,一行是特定日期的收入,我想在表中添加一个新列,该值是特定日期和特定日期之间的增量(可能是正数或负数)收入前一天,并想知道如何通过SQL实现?
这是一个例子,
原始表,
...
Day1 100
Day2 200
Day3 150
...
新表(在末尾添加增量列,对于第一列,可以指定零),
Day1 100 0
Day2 200 100
Day3 150 -50
我正在使用MySQL / MySQL Workbench。
提前谢谢, 林答案 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