2016-02-16 2 views
0

Есть несколько новых способов (pg9.X) для выражения запроса с функцией, которая зависит от двух соседних строк? Может использовать LATERAL?PostgreSQL 9.5 запрос элегантный, как электронная таблица

Пример:

ID VAL DIFF NOTES 
11 6  3  9-6=3 
12 9  21  30-9=21 
13 30 30  no row to subtract 

Как выразить DIFF(i) = VAL(i-1)-VAL(i) с элегантным SELECT?
PS: пусть ORDER BY "ID"

ответ

3

Это может быть сделано с помощью modern SQL как window functions (которые были доступны с Postgres 8.4)

select id, 
     val, 
     lead(val) over (order by id) - val as diff 
from the_table 
order by id; 

свинца() доступа к значению столбца из следующего строки на основе order by , Если следующей строки нет, результат равен null, поэтому результат вычитания также является нулевым для последней строки.

Редактировать

Если вы хотите использовать несколько функций окна с тем же определением окна вы можете определить один раз и повторно использовать его:

select id, 
     val, 
     lead(c1) over w - val as diff1, 
     lead(c2) over w - val as diff2 
from the_table 
window w as (order by id) 
order by id; 
+0

Спасибо! У меня сложный запрос с длинным ORDER BY и вам нужно больше одного 'lead()' ... Есть способ пропустить в 'over'' (order by id) 'и сказать' 'over' same 'order by', чем этот запрос? –

+0

@PeterKrauss: если у вас есть несколько оконных функций, вы можете объявить окно один раз. См. Мое редактирование –

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