我有一个数据库,每天都不会保存记录。但是,我需要计算有记录的日期之间的余额变化(忽略没有条目的日期)。
例如,我想要一个看起来像这样的结果:
business_date balance prev_date prev_balance diff
2014-01-16 -2648 2014-01-13 436 -3084
2014-02-04 37 2014-01-16 -2648 2685
2014-02-11 37 2014-02-04 37 0
2014-02-12 37 2014-02-11 37 0
2014-02-21 -9633 2014-02-12 37 -9670
2014-03-03 396 2014-02-21 -9633 10029
2014-04-02 -10252 2014-03-03 396 -10648
2014-04-03 -7033 2014-04-02 -10252 3219
2014-05-21 -6849 2014-04-03 -7033 184
不幸的是,我不知道当前和之前日期之间的间隔,因为它总是不同的。所以我不能使用像DATE_SUB这样的东西。
这是我尝试过的:
select * from
(select business_date, balance
from table1
order by business_date) d
LEFT JOIN
(select business_date as prev_date,balance as prev_balance
from table2
order by business_date) a
on a.prev_date > d.business_date
但是这只返回了prev列的一堆空值。
我在这个主题上读到的所有内容似乎都涉及创建一个包含所有日期的表格,但这对我不起作用,因为我的日期列表应该是不完整的,我只想包括我们的日期记录。
关于如何处理此问题的任何建议都非常有用,谢谢。
答案 0 :(得分:0)
在第一个派生表'd'中,生成一个行号并将其包含在表中。然后在第二个派生表'a'中,生成相同的行号。然后使用d.rowno-1 = a.rowno将'a'加到'd'来计算差异。
这是我写的内容。
select * from
(
SELECT * FROM
(
SELECT @curRowd := @curRowd + 1 AS row_number, business_date, balance
FROM bals
) dr
cross JOIN
(
SELECT @curRowd:=0 AS Rowdinit
) initd
) d
LEFT JOIN
(
SELECT * FROM
(
SELECT @curRowa := @curRowa + 1 AS row_number, business_date, balance
FROM bals
) dr
cross JOIN
(
SELECT @curRowa:=0 AS Rowainit
) initd
) a ON a.row_number = d.row_number-1