update?

Den_NV
Дата: 02.06.2006 10:00:26
Здраствуйте.
Подскажите пожалуйста как реализовать в upadate , чтобы значение строки N поля3 было равно сумме поля4 строки N + поля3 строки N-1
Есть еще поле1 здесь храниться id, и поле2 увеличавется на 10 в последующих строках, поле3 различные значения, поле4 Null. кроме строки первой. Первая строка полей 2,3,4 = 0.

ПОЛЕ1 ПОЛЕ2 ПОЛЕ3 ПОЛЕ4
1 0 0 0
1 10 0.5 =D2+C3
1 20 1.5 =D3+C4
2 0 0 0
2 10 1 =D5+C6
2 20 2 =D6+C7


Мне понятно, что состояние таблицы не будет меняться на протяжении всего промежутка времени работы транзакции. И нужно делать commit поле каждой строки, чтобы новое значение поле4 записывалось в таблицу и привычислении следующей строкии поля4, бралось новое значние. Но как это сделать я не знаю.
Заранее всем спасибо.
Jura C
Дата: 02.06.2006 10:40:04
Во первых, у вас расходится условие задачи с примером.
Если считать D как четвертое поле а С как третье то результат должен быть такой:
 1 0 0 0
1 10 0.5 =D2+C1
1 20 1.5 =D3+C2
2 0 0 0
2 10 1 =D5+C4
2 20 2 =D6+C5.
.

Я бы посоветовал сначала сложить select а потом думать о update.
Первое что пришло в голову
select rn, NVL(rn + lag(md, 1) over (order by rn), md)  from
(select rownum as rn, DECODE(MOD(rownum, 2), 0, 1) as md
 from dual connect by level < 10)
alecsey
Дата: 02.06.2006 10:42:40
автор
строки N поля3 было равно сумме поля4 строки N + поля3 строки N-1..... поле4 Null
эт как тебе нужно null+поле3? не совсем понял но помоему тебе нужно прочитать про lag
alex-ls
Дата: 02.06.2006 10:43:19
можно таблицу саму с собой связать и по результатам этого update проводить...
ModelR
Дата: 02.06.2006 11:10:38
Den_NV
значение строки N поля3 было равно сумме поля4 строки N + поля3 строки N-1.
Первая строка полей 2,3,4 = 0.

суть поле3 - накопленная сумма поля4 которое
Den_NV
поле4 Null. кроме строки первой
Итого 0.
Den_NV
Дата: 02.06.2006 11:22:30
Тогда вот так это должно быть

1 0 0 0
1 10 0.5 =D1+C2 = 0.5 = 0+0.5
1 20 1.5 =D2+C3 = 0.5+1.5 = 2
2 0 0 0
2 10 1 =D4+C5 = 0+1 = 1
2 20 2 =D5+C6 = 1+2=3


а селект вот такой
select lag(поле4) over (partition by  поле1 order by поле2)+ поле3
from test
автор
Den_NV
Дата: 02.06.2006 11:34:30
Den_NV
Здраствуйте.
Подскажите пожалуйста как реализовать в upadate , чтобы значение строки N поля3 было равно сумме поля4 строки N + поля3 строки N-1
Есть еще поле1 здесь храниться id, и поле2 увеличавется на 10 в последующих строках, поле3 различные значения, поле4 Null. кроме строки первой. Первая строка полей 2,3,4 = 0.

ПОЛЕ1 ПОЛЕ2 ПОЛЕ3 ПОЛЕ4
1 0 0 0
1 10 0.5 =D2+C3
1 20 1.5 =D3+C4
2 0 0 0
2 10 1 =D5+C6
2 20 2 =D6+C7


Мне понятно, что состояние таблицы не будет меняться на протяжении всего промежутка времени работы транзакции. И нужно делать commit поле каждой строки, чтобы новое значение поле4 записывалось в таблицу и привычислении следующей строкии поля4, бралось новое значние. Но как это сделать я не знаю.
Заранее всем спасибо.


Извените, нашел где ошибся.

Подскажите пожалуйста как реализовать в upadate , чтобы значение строки N поля4 было равно сумме поля4 строки N + поля3 строки N-1
Есть еще поле1 здесь храниться id, и поле2 увеличавется на 10 в последующих строках, поле3 различные значения, поле4 Null. кроме строки первой. Первая строка полей 2,3,4 = 0.

ПОЛЕ1 ПОЛЕ2 ПОЛЕ3 ПОЛЕ4
1 0 0 0
1 10 0.5 =D1+C2=0.5
1 20 1.5 =D2+C3=2
2 0 0 0
2 10 1 =D4+C5=1
2 20 2 =D5+C6=3
Den_NV
Дата: 02.06.2006 11:39:09
Den_NV
Den_NV
Здраствуйте.
Подскажите пожалуйста как реализовать в upadate , чтобы значение строки N поля3 было равно сумме поля4 строки N + поля3 строки N-1
Есть еще поле1 здесь храниться id, и поле2 увеличавется на 10 в последующих строках, поле3 различные значения, поле4 Null. кроме строки первой. Первая строка полей 2,3,4 = 0.

ПОЛЕ1 ПОЛЕ2 ПОЛЕ3 ПОЛЕ4
1 0 0 0
1 10 0.5 =D2+C3
1 20 1.5 =D3+C4
2 0 0 0
2 10 1 =D5+C6
2 20 2 =D6+C7


Мне понятно, что состояние таблицы не будет меняться на протяжении всего промежутка времени работы транзакции. И нужно делать commit поле каждой строки, чтобы новое значение поле4 записывалось в таблицу и привычислении следующей строкии поля4, бралось новое значние. Но как это сделать я не знаю.
Заранее всем спасибо.


Все совсем "плохой" стал. Вот как это изначально должно выглядеть.

Подскажите пожалуйста как реализовать в upadate , чтобы значение строки N поля4 было равно (поле3 строки N + поле4 строки N-1)
Есть еще поле1 здесь храниться id, и поле2 увеличавется на 10 в последующих строках, поле3 различные значения, поле4 Null. кроме строки первой. Первая строка полей 2,3,4 = 0.

ПОЛЕ1 ПОЛЕ2 ПОЛЕ3 ПОЛЕ4
1 0 0 0
1 10 0.5 =D1+C2=0.5
1 20 1.5 =D2+C3=2
2 0 0 0
2 10 1 =D4+C5=1
2 20 2 =D5+C6=3
dmidek
Дата: 02.06.2006 11:55:31
SQL> create table scott.tab as
  2  (select 1 a, 0 b,0 c, 0 d
  3   from dual
  4   union all
  5   select 1 a, 10 b,0.5 c, 0 d
  6   from dual
  7   union all
  8   select 1 a, 20 b,1.5 c, 0 d
  9   from dual
 10   union all
 11   select 2 a, 0 b,0 c, 0 d
 from dual
 12   13   union all
 14   select 2 a, 10 b,1 c, 0 d
 15   from dual
 union all
 16   17   select 2 a, 10 b,2 c, 0 d
 18   from dual
 19  )
/
 20

SQL> update scott.tab t1
set d =
(select lag_c
 from
( select rowid, lag(c,1,0) over (partition by a order by b, c) + c lag_c
  from scott.tab)
 where rowid = t1.rowid
 )
 /

6 Zeilen wurden aktualisiert.

SQL> select * from scott.tab
  2  /

         A          B          C          D
---------- ---------- ---------- ----------
         1          0          0          0
         1         10         ,5         ,5
         1         20        1,5          2
         2          0          0          0
         2         10          1          1
         2         10          2          3

6 Zeilen ausgewählt.

SQL>
Den_NV
Дата: 02.06.2006 12:40:29
dmidek
SQL> create table scott.tab as
  2  (select 1 a, 0 b,0 c, 0 d
  3   from dual
  4   union all
  5   select 1 a, 10 b,0.5 c, 0 d
  6   from dual
  7   union all
  8   select 1 a, 20 b,1.5 c, 0 d
  9   from dual
 10   union all
 11   select 2 a, 0 b,0 c, 0 d
 from dual
 12   13   union all
 14   select 2 a, 10 b,1 c, 0 d
 15   from dual
 union all
 16   17   select 2 a, 10 b,2 c, 0 d
 18   from dual
 19  )
/
 20

SQL> update scott.tab t1
set d =
(select lag_c
 from
( select rowid, lag(c,1,0) over (partition by a order by b, c) + c lag_c
  from scott.tab)
 where rowid = t1.rowid
 )
 /

6 Zeilen wurden aktualisiert.

SQL> select * from scott.tab
  2  /

         A          B          C          D
---------- ---------- ---------- ----------
         1          0          0          0
         1         10         ,5         ,5
         1         20        1,5          2
         2          0          0          0
         2         10          1          1
         2         10          2          3

6 Zeilen ausgewählt.

SQL>



Спасибо большое.
но нужно немного не так.
У вас получается, что если я добавлю строчку


A B C D
1 1 0 0 0
2 1 10 0,5 0,5
3 1 20 1,5 2
4 1 30 6 7,5
5 2 0 0 0
6 2 10 1 1
7 2 20 2 3
8


а и мне нужно чтобы


A B C D
1 1 0 0 0
2 1 10 0,5 0,5
3 1 20 1,5 2
4 1 30 6 8
5 2 0 0 0
6 2 10 1 1
7 2 20 2 3
8 2 30 25 28