2013-06-13 5 views
1

У меня есть таблица, которая регистрирует значение от электрических счетчиковобновления Postgres с предыдущей строкой

таблицы выглядит следующим образом

SELECT created_at, value, delta 
FROM metervalues 
ORDER BY created_at 

2013-05-28 07:59:00 | 752105,6 | null 
2013-05-28 08:14:00 | 752156,0 | null 
2013-05-28 08:29:00 | 752207,2 | null 
2013-05-28 08:44:00 | 752259,2 | null 
2013-05-28 08:59:00 | 752312,8 | null 
2013-05-28 09:14:00 | 752366,4 | null 
2013-05-28 09:29:00 | 752417,2 | null 

теперь я хочу, чтобы рассчитать расход так

delta(current record) = value(current record) - value(previous record) 

It может произойти, что записи добавляются позже, поэтому идентификатор записи не обязательно следует порядку «created_at».

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

Можно ли это решить SQL direct? Я пробовал некоторые образцы с курсорами, но на самом деле не нашел решения.

ответ

1
SELECT 
    created_at, 
    "value", 
    "value" - lag("value", 1, 0) over(order by created_at) as consumption 
FROM metervalues 
ORDER BY created_at 

EDIT: Missing as перед тем consumption - теперь исправлена ​​

+0

Привет, отлично, это работает sofar, мне нужно было изменить значение по умолчанию (0) на 0.0, так как значение представляет собой числовое поле. Как получить потребление, обновленное в поле «delta» записей, –

+0

заставило его работать! с new_values ​​как ( SELECT, ид, created_at, "значение", "значение" - лаг ("значение", 1, 0,0) по (порядка по created_at) потребления ОТ metervalues ​​ ORDER BY created_at) обновление metervalues как mv set delta = new_values.consumption from new_values ​​ где mv.id = new_values.id; –

2

Таблицы SQL по своей сути неупорядочены, поэтому нет «предыдущей» записи. Вопрос не имеет смысла, если у вас нет столбца, который указывает порядок.

Я думаю, что вопрос в том, что created_at не такой столбец, но RecordId есть. Если да, то вы можете использовать функцию lag():

select created_at, value, 
     (value - lag(value) over (order by recordId)) as delta 
from metervalues 

Если у вас нет такого идентификатора, то вам нужно найти способ, чтобы задать порядок значений.

+0

Привет, я знаю, поэтому есть «заказ по created_at» в операторе отбора в образце выше –

+0

@AlexanderMelle. , , Затем просто используйте 'created_at' вместо' recordId' в вышеуказанном запросе. –

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