В Postgresql нужно вычислить значения двух строк column_d2=(column_c2 * 0,3) (column_c3 * 0,7) ? с помощью функции обновления

#sql #postgresql

Вопрос:

Я создал одну таблицу типа «тест» и вставил значения в столбцы

 create table test( Sno       integer 
                 , Column_A   text
                 , Column_B   numeric
                 , Column_C   numeric
                 ) ;
                 
           
insert into test (sno, Column_A, Column_B) 
     (values (1 ,'0 -1 Yrs',     0.963190184)     
           , (2 ,'1-4 Yrs',      0.992394232)     
           , (3 ,'5 - 9 Yrs',    0.994964922)     
           , (4 ,'10 - 14 Yrs',  0.998372661)     
           , (5 ,'15 - 19 Yrs',  0.994485603)     
           , (6 ,'20- 24 Yrs',   0.992903887)     
           , (7 ,'25 - 29 Yrs',  0.994008987)     
           , (8 ,'30 - 34 Yrs',  0.994041445)     
           , (9 ,'35 - 39 Yrs',  0.991283828)     
           , (10,'40 - 44 Yrs',  0.987141228) 
     ); 


select * from test; 
  
alter table test add column column_d bigint; ----adding a new column

update test
   set column_c = r_colc
  from (
        with recursive demo( rno, r_colb, r_colc) as 
             ( select 0, 1::numeric,  100000::numeric  -- prime the recursion 
               union all 
               select sno, column_b,  r_colb*r_colc
                from test 
                join demo  
                  on (sno = (select min(sno)          -- since I do trust autogenerated ids 
                               from test              -- to actually be in perfect sequence
                              where sno > rno))    
             )
        select rno, r_colb, round(r_colc) r_colc
          from demo 
        ) s
  where sno = rno; 
  

select * from test; 
 

Теперь мне нужно вычислить значения двух строк column_d2=(column_c2 * 0,3) (column_c3 * 0,7) ? с помощью функции обновления

СВЕДЕНИЯ О ТАБЛИЦЕ

https://dbfiddle.uk/?rdbms=postgres_9.6amp;fiddle=b5bbd37ce0ea5893d136df5be05dd281

Комментарии:

1. Я прикрепил таблицу с подробным форматом изображения

2. Заголовок не соответствует тексту внизу, и запрос не соответствует обоим (не вижу 0.3 или 0.7) Пожалуйста, проясните свой вопрос

3. Привет @Turo, мне нужно умножить значение столбца на значение по умолчанию(0,3 и 0,7) и добавить умноженные значения, а затем распечатать результат в других столбцах. Я приложил данные таблиц для вашей любезной справки.

4. Привет @Turo, я отредактировал заголовок

5. Я все еще не понимаю, но я бы посоветовал сделать это хранимой процедурой и перебирать записи

Ответ №1:

На самом деле это простое обновление, если предположить, что значение столбца в моем комментарии правильное. Используйте функцию ведущего окна, чтобы получить значение столбца из следующей строки. Тогда обновление — это простое умножение:

 update test t  
   set column_d = (cr*.3   crn*.7)::bigint
  from (select sno, column_c cr, lead(column_c) over(order by sno) crn from test) s
 where t.sno = s.sno 
   and t.column_a not like '0%';
 

Примечание: cr-это столбец_c для текущей строки, а crn-текущая строка roe в следующей строке. Но это, очевидно, вызывает вопрос: что вы делаете для нового столбца, когда в следующей строке нет.

Комментарии:

1. Привет @Страхующий, Прежде всего, большое спасибо вам за вашу огромную поддержку на этом форуме. И мне действительно жаль это делать, я не буду этого делать в будущем. Я объясню, что каждая строка column_d имеет отдельный расчет. Например, в первом столбце d (строки 2) =(0,3*Столбец C(строка 2) 0,7* Столбец C(строка 3) — для столбца A 0-1 лет и следующего столбца d (строка 3)=(4/7) * (Столбец C(строка 3) Столбец C(строка 4) — для столбца A 1-4 лет и следующего столбца D (строка 4) = (5/2)*(Столбец C (строка 4) Столбец C (строка 5)) — для столбца от 5-9 лет до 35-39 лет

2. и последний столбец D(строка 11) =Столбец C/другое значение поля —-Для столбца A 80 и старше лет.

3. Привет @Страхующий, я выполнил задачу на основе вашего запроса «обновить». Теперь у меня есть изменить столбец таблицы _e

4. как я могу вставить свой sql-запрос в этот форум

5. обновление life_expectancy_vellore t установите значение no_of_person_years_lived = (startlifer*0,3 startlifern*0,7)::значение из (выберите идентификатор, startlife, startlifer, ведущий(startlife) по(порядку по идентификатору) startlifern из life_expectancy_vellore), где t.id=s.id и т. д. возрастной диапазон=’0-1 лет’;