Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Проапдейтить поля таблицы с помощью скл  [new]
Димитрий85
Member

Откуда:
Сообщений: 84
Дано:
increment_num key calculated_val
0 null null
1 null null
2 100 null
3 null null
4 null null
5 null null
6 101 null
7 101 null
8 101 null
9 null null
10 null null
11 null null
12 null null
Хочется получить такие значения для поля calculated_val
increment_num key calculated_val
0 null 1
1 null 2
2 100 0
3 null 1
4 null 2
5 null 3
6 101 0
7 101 0
8 101 0
9 null 1
10 null 2
11 null 3
12 null 4

Диапазон increment_num всегда непрерывный от 0 до n<10000.
С Pl/Sql -м все понятно, а можно через sql это сделать? Oracle 10.2.0.4.0
Спасибо.
11 ноя 11, 11:55    [11580408]     Ответить | Цитировать Сообщить модератору
 Re: Проапдейтить поля таблицы с помощью скл  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Димитрий85,

stff start_of_group
11 ноя 11, 12:00    [11580461]     Ответить | Цитировать Сообщить модератору
 Re: Проапдейтить поля таблицы с помощью скл  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Димитрий85
Диапазон increment_num всегда непрерывный от 0 до n<10000.

with s as (
select 0 f1,  null f2, null f3 from dual union all
select 1,  null, null from dual union all
select 2,  100 , null from dual union all
select 3,  null, null from dual union all
select 4,  null, null from dual union all
select 5,  null, null from dual union all
select 6,  101 , null from dual union all
select 7,  101 , null from dual union all
select 8,  101 , null from dual union all
select 9,  null, null from dual union all
select 10, null, null from dual union all
select 11, null, null from dual union all
select 12, null, null from dual)
select f1, f2, 
nvl2(f2, 0, row_number() over (partition by f2, rn order by f1)) rn
from
 (select f1, f2, 
  f1 - row_number() over (partition by f2 order by f1) rn
  from s
 ) 
order by f1;

F1                     F2                     RN                     
---------------------- ---------------------- ---------------------- 
0                                             1                      
1                                             2                      
2                      100                    0                      
3                                             1                      
4                                             2                      
5                                             3                      
6                      101                    0                      
7                      101                    0                      
8                      101                    0                      
9                                             1                      
10                                            2                      
11                                            3                      
12                                            4                      

 13 rows selected  
11 ноя 11, 12:05    [11580523]     Ответить | Цитировать Сообщить модератору
 Re: Проапдейтить поля таблицы с помощью скл  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Димитрий85,

Далее merge.
11 ноя 11, 12:05    [11580526]     Ответить | Цитировать Сообщить модератору
 Re: Проапдейтить поля таблицы с помощью скл  [new]
Димитрий85
Member

Откуда:
Сообщений: 84
AmKad, спасибо
11 ноя 11, 12:07    [11580537]     Ответить | Цитировать Сообщить модератору
 Re: Проапдейтить поля таблицы с помощью скл  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
with t as (select 0 increment_num,  null key , null calculated_val from dual union all
select 1,  null, null from dual union all
select 2,  100 , null from dual union all
select 3,  null ,null from dual union all
select 4,  null ,null from dual union all
select 5,  null ,null from dual union all
select 6,  101  ,null from dual union all
select 7,  101  ,null from dual union all
select 8,  101  ,null from dual union all
select 9,  null ,null from dual union all
select 10, null ,null from dual union all
select 11, null ,null from dual union all
select 12, null ,null from dual )
select increment_num,
       key,
       decode(key,null,dense_rank() over (partition by rn order by increment_num),0)
       from(
select increment_num,
       key,
       increment_num-row_number() over (partition by key order by increment_num) rn
from t)
order by increment_num
11 ноя 11, 12:09    [11580562]     Ответить | Цитировать Сообщить модератору
 Re: Проапдейтить поля таблицы с помощью скл  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Димитрий85,

+ Bonus
with s as (
select 0 f1,  null f2, null f3 from dual union all
select 1,  null, null from dual union all
select 2,  100 , null from dual union all
select 3,  null, null from dual union all
select 4,  null, null from dual union all
select 5,  null, null from dual union all
select 6,  101 , null from dual union all
select 7,  101 , null from dual union all
select 8,  101 , null from dual union all
select 9,  null, null from dual union all
select 10, null, null from dual union all
select 11, null, null from dual union all
select 12, null, null from dual)
select *
from s
model
dimension by (f1)
measures(f2, 0 f3)
rules
(f3[f1] order by f1 = nvl2(f2[cv()], 0, nvl(f3[cv()-1], 0) + 1) 
);

F1                     F2                     F3                     
---------------------- ---------------------- ---------------------- 
0                                             1                      
1                                             2                      
2                      100                    0                      
3                                             1                      
4                                             2                      
5                                             3                      
6                      101                    0                      
7                      101                    0                      
8                      101                    0                      
9                                             1                      
10                                            2                      
11                                            3                      
12                                            4                      

 13 rows selected 
11 ноя 11, 14:10    [11581770]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить