Вопрос:
У меня есть таблица SQL, одна строка – это доход в конкретный день, и я хочу добавить новый столбец в таблицу, значение – прирост (может быть положительный или отрицательный) доход между конкретным днем и предыдущий день и интересно, как реализовать SQL?
Вот пример,
оригинальная таблица,
… Day1 100 Day2 200 Day3 150 …
новая таблица (добавить инкрементный столбец в конце и для первого столбца, может назначить ноль),
Day1 100 0 Day2 200 100 Day3 150 -50
Я использую MySQL/MySQL Workbench.
спасибо заранее,
Lin
Лучший ответ: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 строки, вам нужно создать представление, которое суммирует все дни по дням.
Ответ №1
Если вы согласны с переупорядочиванием столбцов немного, что-то вроде этого довольно просто понять:
SET @prev := 0; SELECT day, revenue — @prev AS diff, @prev := revenue AS revenue FROM revenue ORDER BY day ASC;
Фокус в том, что мы вычисляем разницу с предыдущим первым, затем устанавливаем предыдущий ток и отображаем его как ток за один шаг.
Обратите внимание, что это зависит от правильности заказа, поскольку вычисления выполняются во время возвращения строк, поэтому вам нужно убедиться, что у вас есть предложение ORDER BY, которое возвращает дни в правильном порядке.
Ответ №2
Попробуйте
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
Это вычислит значение diff, даже если существует missing date