#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 лет’;