Mam tabelę z trzema kolumnami col_a, col_b i col_c . col_a i col_b mają wartości, a col_c ma wartości null. Chcę tylko zaktualizować col_c z sekwencją początkową col_a odpowiadającą col_b . Poniżej przedstawiono oczekiwane wartości col_c . Użycie kursora, aby osiągnąć ten scenariusz.

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
1
Prog_2918 11 marzec 2020, 04:22

2 odpowiedzi

Najlepsza odpowiedź

Jedną z metod jest użycie skorelowanego podzapytania, które znajduje dla każdego zbioru rekordów COL_B minimalną wartość COL_A rozpoczynającą sekwencję. Do tej wartości dodajemy odpowiednie przesunięcie za pomocą 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);
1
Tim Biegeleisen 11 marzec 2020, 02:04

Możesz skorzystać z funkcji analitycznej w następujący sposób:

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

Twoje zdrowie!!

0
Popeye 11 marzec 2020, 01:53