2015-03-16 2 views
0

У меня есть база данных, где записи не хранятся каждый день. Однако мне нужно рассчитать изменение баланса между датами, где есть записи (без учета дат, когда нет записей).Показать предыдущую дату из неполного списка дат в MySQL

Например, я хотел бы результат, который выглядит следующим образом:

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 

Но это возвращает только кучу нулей для столбцов пред.

Все, что я читал по этому вопросу, похоже, связано с созданием таблицы всех дат, но это не сработает для меня, так как мой список дат должен быть неполным, я хочу включить только даты, для которых мы имеют записи.

Любые предложения о том, как подойти к этому, будут очень полезны, спасибо.

ответ

0

В вашей первой производной таблице 'd', сгенерируйте номер строки и включите ее в таблицу. Затем во второй производной таблице «a», сгенерируйте одинаковые номера строк. Затем присоедините 'a' к 'd', используя d.rowno-1 = a.rowno для вычисления diff.

Вот что я написал для этого.

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 
+0

Кажется, что это сработает. Однако я не знаю, как создавать номера строк в MySQL (я всегда думал, что MySQL не делает номера строк?). Все, что я искал для создания чисел строк в MySQL, похоже, использует переменные, с которыми я не знаком (может быть, сегодня это день, чтобы узнать?) Кроме того, моя первая таблица - таблица d, вторая таблица - таблица a, поэтому ваш ответ немного запутан. – Hopper06

+0

Да, использование переменных - способ генерации чисел строк в mysql. –

+0

Это показывает вам, как: http://stackoverflow.com/questions/3126972 –

Смежные вопросы