Thread: Windowing ?
Hi,
I have a table describing sort of ordered road segments and their associated weight. I would like to calculate weight deltas between two consecutive segments. Problem is to substract previous from current row and reuses result as input for the next row. I tried some windowing tests but was unsuccessful.
Input table :
road segment weight
1 1 80
1 2 5
1 3 3
2 1 75
2 2 8
2 3 12
2 4 3
The result should be a new delta column :
road segment weight delta
1 1 80 80 (80-0) first row
1 2 5 75 (80-5)
1 3 3 72 (75-3)
2 1 75 75 (75-0)
2 2 8 67 (75-8)
2 3 12 55 (67-12)
2 4 3 52 (55-3)
Thanks for any help,
By the way, thanks again to Andreas and Martin that unstucked my mind yesterday as I was searching for complicated solutions when a very simple one existed.
Have a good day (or good evening)
Olivier
Am 11.12.2017 um 18:09 schrieb Olivier Leprêtre: > > Hi, > > I have a table describing sort of ordered road segments and their > associated weight. I would like to calculate weight deltas between two > consecutive segments. Problem is to substract previous from current > row and reuses result as input for the next row. > You can use the lag() - function. select ..., lag(weight) over (partition by road order by segment) ... Regards, Andreas -- 2ndQuadrant - The PostgreSQL Support Company. www.2ndQuadrant.com
Am 11.12.2017 um 18:15 schrieb Andreas Kretschmer: > > > Am 11.12.2017 um 18:09 schrieb Olivier Leprêtre: >> >> Hi, >> >> I have a table describing sort of ordered road segments and their >> associated weight. I would like to calculate weight deltas between >> two consecutive segments. Problem is to substract previous from >> current row and reuses result as input for the next row. >> > > You can use the lag() - function. > > select ..., lag(weight) over (partition by road order by segment) ... > > sorry, my mistake, that was wrong. That should do the job: test=*# select * from xxx; road | segment | weight ------+---------+-------- 1 | 1 | 80 1 | 2 | 5 1 | 3 | 3 2 | 1 | 75 2 | 2 | 8 2 | 3 | 12 2 | 4 | 3 (7 Zeilen) test=*# select road, segment, weight, first_value(weight) over (partition by road order by segment) -y from (select *, sum(weight) over (partition by road order by segment) - first_value(weight) over (partition by road order by segment) as y from xxx) foo; road | segment | weight | ?column? ------+---------+--------+---------- 1 | 1 | 80 | 80 1 | 2 | 5 | 75 1 | 3 | 3 | 72 2 | 1 | 75 | 75 2 | 2 | 8 | 67 2 | 3 | 12 | 55 2 | 4 | 3 | 52 (7 Zeilen) Regards, Andreas -- 2ndQuadrant - The PostgreSQL Support Company. www.2ndQuadrant.com