Обновление seq на основе критериев - Oracle SQL - PullRequest
0 голосов
/ 02 мая 2019

У меня есть таблица:

table1

id  element_id  element_value   lx_seq  line_num
59  A301-01     Test            1       25
59  A301-01     Test            1       26
59  K301-01     Test            1       27
59  K301-01                     1       28
59  K302-01     18105678982800  1       28
59  K304-01     TOPS            1       28
59  K305-01     7               1       28
59  K306-01     888P            1       28

60  K301-01     Test            1       27
60  K301-01                     1       28
60  K302-01     18105678982800  1       28
60  K304-01     TOPS            1       28
60  K305-01     7               1       28
60  K306-01     888P            1       28

61  K301-01     Test            1       27
61  K301-01                     1       27

62  K301-01     Test            1       27
62  K301-01                     1       28
62  K301-01     18105678982800  1       29
62  K304-01     TOPS            1       29
62  K305-01     7               1       29
62  K306-01     888P            1       29

Это выходная таблица:

table2

id  element_id  element_value   lx_seq  line_num
59  A101-01     Test            1       25
59  A101-01     Test            1       26
59  K301-01     Test            1       27
59  K301-01                     2       28
59  K302-01     18105678982800  2       28
59  K304-01     TOPS            2       28
59  K305-01     7               2       28
59  K306-01     888P            2       28

60  K301-01     Test            1       27
60  K301-01                     2       28
60  K302-01     18105678982800  2       28
60  K304-01     TOPS            2       28
60  K305-01     7               2       28
60  K306-01     888P            2       28

61  K301-01     Test            1       27
61  K301-01                     1       27

62  K301-01     Test            1       27
62  K301-01                     2       28
62  K301-01     18105678982800  3       29
62  K304-01     TOPS            3       29
62  K305-01     7               3       29
62  K306-01     888P            3       29

Мне нужно обновитьlx_seq тогда и только тогда, когда в 1 id у нас есть несколько комбинаций K3 + line_num.Он не должен работать для любых других элементов, таких как A1.

Как я могу увеличить lx_seq на основе вышеуказанного условия в Oracle SQL?

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Вы можете сделать что-то вроде следующего, используя dens_rank

--first select all not K3 rows and keep lx_seq same    
SELECT id, element_id, element_value, lx_seq, line_num 
from table1 where element_id not like 'K3%'
UNION ALL
--select K3 rows and based on id and line_num generate rank
SELECT id, element_id, element_value, 
dense_rank() over (partition by id, line_num order by line_num) lx_seq, 
line_num 
from table1 where element_id  like 'K3%'

Пример оператора обновления:

MERGE INTO table1 A USING
(
    SELECT id, element_id, element_value, 
    dense_rank() over (partition by id, line_num order by line_num) lx_seq, 
    line_num 
    FROM table1 
    WHERE element_id  LIKE 'K3%'
) B 
ON (A.id = B.id AND A.line_num = B.line_num AND A.element_id = B.element_id)
WHEN MATCHED THEN
  UPDATE SET A.lx_seq = B.lx_seq;
0 голосов
/ 02 мая 2019

вам нужна функция dense_rank() для столбца lx_seq, как показано ниже

dense_rank() over (partition by id order by line_num) as lx_seq,

, и это не должно содержать уже вычисленный столбец в столбце, что нарушает правило нормализациидля базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...