динамически обновлять значение последовательности - plsql - PullRequest
1 голос
/ 11 марта 2020

У меня есть таблица с тремя столбцами col_a, col_b и col_ c. col_a и col_b имеют значения, а col_ c имеет нулевые значения. Я просто хочу обновить col_ c с последовательностью запуска col_a , соответствующей col_b . Ожидаемые значения col_ c показаны ниже. Использование курсора для достижения этого сценария.

COL_A       COL_B       COL_C

     1          1         1   
     2          1         2  
     3          1         3 
     4          1         4  
     5          1         5  
     6          1         6  
     7          1         7  
     8          1         8  
     9          1         9  
    10          1        10  
   101          2       101
   102          2       102
   104          2       103
   106          2       104
   107          2       105
   108          2       106
   110          2       107
   201          3       201
   202          3       202
   203          3       203
   204          3       204
   205          3       205
   301          5       301
   302          5       302
   305          5       303
   306          5       304

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Один из подходов заключается в использовании коррелированного подзапроса, который находит для каждого набора COL_B минимальное значение COL_A для начала последовательности. К этому значению мы добавляем соответствующее смещение, используя COUNT.

UPDATE yourTable t1
SET COL_C = (SELECT MIN(t2.COL_A) +
                    COUNT(CASE WHEN t2.COL_A < t1.COL_A THEN 1 END)
             FROM yourTable t2
             WHERE t2.COL_B = t1.COL_B);
0 голосов
/ 11 марта 2020

Вы можете воспользоваться аналитической функцией следующим образом:

Merge into your_table t
Using
(Select col_a, col_b,
       First_value(col_a) over (partition by col_b order by col_a)
       + row_number() over (partition by col_b order by col_a) - 1 as col_c
   From your_table) S
On (t.col_a = s.col_a and t.col_b = s.col_b)
When matched then 
Update set t.col_c = s.col_c

Приветствия !!

...