Рассчитать разницу между двумя строками в SQL

Вопрос:У меня есть таблица SQL, одна строка - это доход в конкретный день, и я хочу добавить новый столбец в таблицу, значение - прирост (может быть положительный или отрицательный) доход между конкретным днем ​​и предыдущий день и интересно, как реализовать SQL? Вот пример, оригинальная таблица, ... Day1 100 Day2 200 Day3 150 ... новая таблица

Вопрос:

У меня есть таблица 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

Оцените статью
Добавить комментарий