2012-02-01 27 views
7

Tôi có một bảng trong Postgressql DB như thế này:So sánh ghi vào kỷ lục trước đó trong 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 

Làm thế nào để có được kết quả này?

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 

Cảm ơn rất nhiều !!!

Trả lời

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; 

này giả định rằng ENDDATE luôn lớn hơn STARTDATE từ cùng hàng và không có ENDDATE lớn hơn sau STARTDATE

+0

Cái này hoạt động tuyệt vời. Cảm ơn. – Alex

+0

Bí danh 'WINDOW client_window' rất đẹp, lưu ý rằng – Davos