在MySQL中显示不完整日期列表中的上一个日期

在MySQL中显示不完整日期列表中的上一个日期,mysql,sql,date,Mysql,Sql,Date,我有一个不是每天都保存记录的数据库。但是,我需要计算有记录的日期之间的余额变化,忽略没有条目的日期 例如,我希望得到如下结果: 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 201

我有一个不是每天都保存记录的数据库。但是,我需要计算有记录的日期之间的余额变化,忽略没有条目的日期

例如,我希望得到如下结果:

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列,这只返回一堆空值

我读到的关于这个主题的所有内容似乎都涉及到创建一个包含所有日期的表,但这对我来说不起作用,因为我的日期列表应该是不完整的,我只想包括我们有记录的日期


任何关于如何实现这一点的建议都将非常有用,谢谢。

在您的第一个派生表“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

这似乎是可行的。但是我不知道如何在MySQL中生成行号,我一直认为MySQL不做行号?。关于在MySQL中生成行号,我查到的所有内容似乎都使用了变量,我不太熟悉,也许今天是学习的日子?另外,我的第一个表是表d,第二个表是表a,所以您的回答有点混乱。是的,在mysql中使用变量是生成行号的方法。谢谢,我阅读了关于如何创建行号的页面,它在一个独立的表上工作。但当我尝试将它与第二个表联接时,没有数据返回。这就是我所做的:选择*从select[at]curRow:=[at]curRow+1作为行号、业务日期、表1余额加入选择[at]curRow:=0 r d左加入选择[at]curRow:=[at]curRow+1作为行号、业务日期、表2余额加入选择[at]谢谢你为帮助我所付出的一切努力。我尝试了你的解决方案,结果也一样。当我处理indivudual表时,我得到了一个非常好的行号结果。但一旦我做了左连接,它就不会返回任何结果。坦白说,这让我有点困惑。