2014-01-20 6 views
0

У меня есть таблица, в которой у меня есть 4 колонки: emp_no, desig_name, from_date и to_date:PostgreSQL запрос для нескольких обновлений

emp_no desig_name  from_date     to_date 
1001 engineer   2004-08-01 00:00:00 
1001 sr.engineer  2010-08-01 00:00:00 
1001 chief.engineer 2013-08-01 00:00:00 

Так что мой вопрос заключается в обновлении первой строки to_date колонки только за один день до from_date из второй ряд, а также второй?

После обновления он должен выглядеть следующим образом:

emp_no desig_name  from_date     to_date 
1001 engineer   2004-08-01 00:00:00  2010-07-31 00:00:00 
1001 sr.engineer  2010-08-01 00:00:00  2013-07-31 00:00:00 
1001 chief.engineer 2013-08-01 00:00:00 
+1

Есть ли единственное поле в этой таблице? –

+0

Да, есть также colmn имя "promotion_id", которое является уникальным полем – Anand

+0

Does promotion_id определяет порядок строк? – vidaica

ответ

1

Вы можете вычислить «следующий» дату, используя функцию lead().

Это расчетное значение может быть использована для обновления таблицы:

with calc as (
    select promotion_id, 
     emp_no, 
     from_date, 
     lead(from_date) over (partition by emp_no order by from_date) as next_date 
    from emp 
) 
update emp 
    set to_date = c.next_date - interval '1' day 
from calc c 
    where c.promotion_id = emp.promotion_id; 

Как вы можете видеть, что получение значения довольно легко, и хранить полученную информацию очень часто не является хорошей идеей. Возможно, вам захочется рассмотреть представление, которое рассчитывает эту информацию «на лету», поэтому вам не нужно обновлять таблицу каждый раз, когда вы вставляете новую строку.

SQLFiddle пример: http://sqlfiddle.com/#!15/31665/1

+0

Я не получаю его правильно, согласно урскому ответу u сначала создал функцию «calc», а затем запустил запрос на обновление? – Anand

+0

и i m using PostgreSQL9.1 – Anand

+0

@Anand: это один оператор. В моем заявлении нет «функции». Вы взглянули на SQLFiddle? Он будет работать с Postgres 9.1. И, пожалуйста, воздержитесь от использования «leet speak». Это признак вежливости и уважения к написанию правильных предложений, особенно если вы просите бесплатную помощь. –

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