2012-02-01 16 views
7

Tengo una tabla en la base de datos PostgreSQL como esto:registro a registro anterior en PostgreSQL

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 

¿Cómo conseguir este resultado?

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 

¡Muchas gracias!

Respuesta

9
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; 

Esto supone que enddate es siempre mayor que startdate de la misma fila y que ningún enddate es mayor que el siguiente startdate

+0

Éste funciona muy bien. Gracias. – Alex

+0

el alias 'WINDOW client_window' es bueno, teniendo en cuenta que uno – Davos

Cuestiones relacionadas