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

时间:2015-03-16 18:49:38

标签: 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
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列的一堆空值。

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

关于如何处理此问题的任何建议都非常有用,谢谢。

1 个答案:

答案 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