Вычислить дельту между хронологическими записями (база LibreOffice)

Я новичок в SQL, и эту проблему, с которой я столкнулся, я не могу решить с моими текущими знаниями (почти невозможно стать экспертом по SQL всего за несколько дней).

Учтите, что у меня есть следующая простая таблица:

ID  Date        Counter
1   03/25/14    291.5
2   03/25/14    310
3   03/25/14    270.9
4   03/25/14    320
1   04/25/14    293
2   04/25/14    311
3   04/25/14    278.3
4   04/25/14    322.1

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

ID  Date        Counter  PrevMonthDelta
1   04/25/14    293      1.5
2   04/25/14    311      1
3   04/25/14    278.3    7.4
4   04/25/14    322.1    2.1

В настоящее время я экспериментирую в LibreOffice Base с базой данных формата HSQLDB по умолчанию, но я предполагаю, что это должно работать аналогично для других баз данных SQL.

Заранее спасибо!


person G.Wolf    schedule 12.05.2014    source источник


Ответы (1)


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

SELECT ID, T2.DATE, T2.COUNTER - T1.COUNTER FROM T T1, T T2 WHERE T1.ID = T2.ID AND YEAR (T1.DATE) = YEAR(T2.DATE) AND MONTH(T1.DATE) + 1 = MONTH (T1.DATE)

Если условие должно охватывать конец года, используйте что-то вроде следующего:

AND YEAR (T1.DATE) + (MONTH(T1.DATE) / 12) = YEAR(T2.DATE) AND (MONTH(T1.DATE) MOD 12) + 1 = MONTH (T1.DATE)

Если ваши фактические имена столбцов чувствительны к регистру, используйте имена в двойных кавычках, например «Счетчик».

person fredt    schedule 12.05.2014
comment
Спасибо @fredt, попробую. Единственное, что меня беспокоит, это угловые случаи при смене года. - person G.Wolf; 13.05.2014