I have a table in PostgreSQL DB like this:
Client | Rate | StartDate|EndDate
A | 1000 | 2005-1-1 |2005-12-31
A | 2000 | 2006-1-1 |2006-12-31
A | 3000 | 2007-1-1 |2007-12-31
B | 5000 | 2006-1-1 |2006-12-31
B | 8000 | 2008-1-1 |2008-12-31
C | 2000 | 2006-1-1 |2006-12-31
How to get this result?
Client | Rate | StartDate|EndDate |Pre Rate | Pre StartDate |Pre EndDate
A | 1000 | 2005-1-1 |2005-12-31 | | |
A | 2000 | 2006-1-1 |2006-12-31 | 1000 | 2005-1-1 |2005-12-31
A | 3000 | 2007-1-1 |2007-12-31 | 2000 | 2006-1-1 |2006-12-31
B | 5000 | 2006-1-1 |2006-12-31 | | |
B | 8000 | 2008-1-1 |2008-12-31 | 5000 | 2006-1-1 |2006-12-31
C | 2000 | 2006-1-1 |2006-12-31
SELECT client,
rate,
startdate,
enddate,
lag(rate) over client_window as pre_rate,
lag(startdate) over client_window as pre_startdate,
lag(enddate) over client_window as pre_enddate
FROM the_table
WINDOW client_window as (partition by client order by startdate)
ORDER BY client, stardate;
This assumes that enddate is always greater than startdate from the same row and that no enddate is greater than the following startdate