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
2 odpowiedzi
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);
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!!
Podobne pytania
Nowe pytania
sql
Structured Query Language (SQL) to język służący do wykonywania zapytań w bazach danych. Pytania powinny zawierać przykłady kodu, strukturę tabeli, przykładowe dane i znacznik używanej implementacji DBMS (np. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 itp.). Jeśli Twoje pytanie dotyczy wyłącznie konkretnego DBMS (używa określonych rozszerzeń / funkcji), użyj zamiast tego tagu tego DBMS. Odpowiedzi na pytania oznaczone tagiem SQL powinny używać standardu SQL ISO / IEC.