powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
15 сообщений из 15, страница 1 из 1
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39705793
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Подскажите, пожалуйста, по следующему вопросу...

В табличке есть список стран в поле NAME и есть порядковый номер стран в поле ORDER_NUM c шагом 10 (Австралия 10, АВСТРИЯ 20...Багамы 90....). Если отсортировать по порядковому номеру, то страны будут отсортированы по алфавиту. Есть список новых стран в отдельной вьюхе и их нужно добавить в данную табличку, чтобы при сортировке по ORDER_NUM - всё шло по алфавиту, при этом не затирая старые ORDER_NUM.

Идея была как то вставить новые значения ORDER_NUM между шагов, к примеру между 10 и 20 (11, 12...), 20 и 30 (21, 22...). По идее этого шага должно хватить, может можно как то сделать дробный шаг?

Пока я сделал UNION между табличкой и вьюхой и отсортировал страны следующим образом:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
[/SRC]select rownum as v, country_name, num from (
select NAME as country_name, ORDER_NUM as num from VD_DATA_COPY3
where (   TMPL_ROW_ID = 3222
            OR TMPL_ROW_ID = 3223
            OR TMPL_ROW_ID = 3224
            OR TMPL_ROW_ID = 3225)
       AND t055_id = 1952
       AND ORDER_NUM not in (1340, 1350, 1360)
union 
select NAME as contry_name, null from V_COUNTRY_TEST3
order by 1)[SRC PLSQL]


Вывод прилагаю.

Где нужно проставить ROW_NUM - здесь пока NULL.
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39705806
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
num + v/1000 не вариант?
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39705816
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zorlo,

Сделай мердж из юниона с апдейтом на роу_нумбер×10.
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39705918
Cntmdll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zorlo,

Если не учитывать того, что у вас в примере "Андора" имеет меньше номер, чем "Ангола", то возможно пригодится следующий пример:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
insert all
into test.VD_DATA_COPY3 values ('АВСТРАЛИЯ','10')
into test.VD_DATA_COPY3 values ('АВСТРИЯ','20')
into test.VD_DATA_COPY3 values ('АЗЕРБАЙДЖАН','30')
into test.VD_DATA_COPY3 values ('АНДОРРА','40')
into test.VD_DATA_COPY3 values ('АНГОЛА','50')
into test.VD_DATA_COPY3 values ('АРГЕНТИНА','60')
into test.VD_DATA_COPY3 values ('АРМЕНИЯ','70')
into test.VD_DATA_COPY3 values ('АРУБА','80')
select * from dual
;

insert all
into test.V_COUNTRY_TEST3 values ('АЛБАНИЯ')
into test.V_COUNTRY_TEST3 values ('АЛЖИР')
into test.V_COUNTRY_TEST3 values ('АМЕРИКАНСКОЕ САМОА')
into test.V_COUNTRY_TEST3 values ('АНГИЛЬЯ')
into test.V_COUNTRY_TEST3 values ('АНТИГУА И БАРБУДА')
select * from dual
;

with a as (
select rownum as v, country_name, num
from (select name as country_name, ORDER_NUM*100 as num from test.VD_DATA_COPY3
union
select name, null from test.V_COUNTRY_TEST3
))
select a.v, a.country_name,

nvl(num,lag(num,1) ignore nulls over (order by v)
+ (select count(*) from a a2 where a2.num is null and a2.v
between (select max(a2.v) from a a2 where a2.v <= a.v and a2.num is not null) and a.v)) "NUM"

from a
;



Результат:
VCOUNTRY_NAMENUM1АВСТРАЛИЯ10002АВСТРИЯ20003АЗЕРБАЙДЖАН30004АЛБАНИЯ30015АЛЖИР30026АМЕРИКАНСКОЕ САМОА30037АНГИЛЬЯ30048АНГОЛА50009АНДОРРА400010АНТИГУА И БАРБУДА400111АРГЕНТИНА600012АРМЕНИЯ700013АРУБА8000
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39706022
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cntmdll,

Пример хороший!
Но нужно, чтобы где проставлено 10, 20, 30 ... - они оставались не изменными. В примере получается, что они меняются 1000, 2000, 3000
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39706076
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zorlo,

проще наверное с использованим start_of_group

попробол через firstr/last_falue

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
with t as (
select * from VD_DATA_COPY3 d3
union all
select c.*,null from V_COUNTRY_TEST3 c
)
,tt as (
   select t.* 
    ,row_number() over(order by country_name) rn
   from t)
,ttt as (
select tt.*
 ,last_value( ORDER_NUM ignore nulls) over(order by country_name 
  rows between unbounded preceding and current row ) l1
 ,first_value(order_num ignore nulls) over(order by country_name 
  rows between current row and unbounded following)  l2
 ,last_value( decode(ORDER_NUM,null,0+null,rn) ignore nulls) over(order by country_name 
  rows between unbounded preceding and current row ) r1
 ,first_value(decode(ORDER_NUM,null,0+null,rn) ignore nulls) over(order by country_name 
  rows between current row and unbounded following)  r2
from tt
)
select 
  country_name
 ,l1+(rn-r1)*(l2-l1)/(r2-r1) new_rn
from ttt
where order_num is null
order by 1
/

COUNTRY_NAME             NEW_RN
-------------------- ----------
АЛБАНИЯ                      32
АЛЖИР                        34
АМЕРИКАНСКОЕ САМОА           36
АНГИЛЬЯ                      38
АНТИГУА И БАРБУДА            55



.....
stax
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39706101
Cntmdll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zorlo,

Что вы будете делать, если строк без значений будет больше 9? В таком случае будет наложение на последующие строки из первой таблицы: 10, 11, 12, 20, 21, ... 28, 29, 30, 31, 32, 30, 31, 32 , 40, 41 ...

А так достаточно не умножать существующие строки с номерами на 100.
И всё же хорошо было бы выверить существующий порядок строк в первой таблице. Сейчас у вас возрастание номеров не совпадает с порядком по алфавиту.
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39706189
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cntmdll,
ORDER_NUM дробные

поправил, если добавлять в начало/конец списка

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
SQL> with t as (
  2  select * from VD_DATA_COPY3 d3
  3  union all
  4  select c.*,null from V_COUNTRY_TEST3 c
  5  )
  6  ,tt as (
  7     select t.*
  8      ,row_number() over(order by country_name) rn
  9     from t)
 10  ,ttt as (
 11  select tt.*
 12   ,nvl(last_value( ORDER_NUM ignore nulls) over(order by country_name,ORDER_NUM
 13    rows between unbounded preceding and current row ),0) l1
 14   ,first_value(order_num ignore nulls) over(order by country_name,ORDER_NUM
 15    rows between current row and unbounded following)  l2
 16   ,nvl(last_value( decode(ORDER_NUM,null,0+null,rn) ignore nulls) over(order by country_name,ORDER_NUM
 17    rows between unbounded preceding and current row ),0) r1
 18   ,nvl(first_value(decode(ORDER_NUM,null,0+null,rn) ignore nulls) over(order by country_name,ORDER_NUM
 19    rows between current row and unbounded following),0)  r2
 20  from tt
 21  )
 22  select
 23    country_name
 24   ,l1+(rn-r1)*nvl2(l2,(nvl(l2,l1+10)-l1)/(r2-r1),10) new_rn
 25  from ttt
 26  where order_num is null
 27  order by 1
 28  /

COUNTRY_NAME             NEW_RN
-------------------- ----------
АА01                          1
АА02                          2
АА03                          3
АА04                          4
АА05                          5
АА06                          6
АА07                          7
АА08                          8
АА09                          9
АЛБАНИЯ                      32
АЛЖИР                        34
АМЕРИКАНСКОЕ САМОА           36
АНГИЛЬЯ                      38
АНТИГУА И БАРБУДА            55
Шамбула01                    90
Шамбула02                   100
Шамбула03                   110
Шамбула04                   120
Шамбула05                   130
Шамбула06                   140
Шамбула07                   150
Шамбула08                   160
Шамбула09                   170
Шамбула10                   180

24 rows selected.




.....
stax
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39706532
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

А зачем так много текста? или я что-то не понял или хватит и такого (т.е. у автора есть 80% запроса, ну и добавить 2 строчки)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
with VD_DATA_COPY3 as (select 'АВСТРАЛИЯ' name, 10 ORDER_NUM from dual union all
select 'АВСТРИЯ',20 from dual union all
select 'АЗЕРБАЙДЖАН',30 from dual union all
select 'АНДОРРА',40 from dual union all
select 'АНГОЛА',50 from dual union all
select 'АРГЕНТИНА',60 from dual union all
select 'АРМЕНИЯ',70 from dual union all
select 'АРУБА',80 from dual
)
, V_COUNTRY_TEST3 as ( --select 'АВСТРАЛИЯ' name  from dual union all
select 'АЛБАНИЯ' name from dual union all
select 'АЛЖИР' from dual union all
select 'АМЕРИКАНСКОЕ САМОА' from dual union all
select 'АНГИЛЬЯ' from dual union all
select 'АНТИГУА И БАРБУДА' from dual)

select v, country_name, nvl(num, lag(num,1,0) ignore nulls over (order by country_name)+(v/power(10,length(cnt))) ) la
from (select rownum as v, country_name, num, count(*) over (order by null) cnt
        from (select NAME as country_name, ORDER_NUM as num 
                from VD_DATA_COPY3
             /*where (   TMPL_ROW_ID = 3222
                      OR TMPL_ROW_ID = 3223
                      OR TMPL_ROW_ID = 3224
                      OR TMPL_ROW_ID = 3225)
                     AND t055_id = 1952
                     AND ORDER_NUM not in (1340, 1350, 1360)*/
              union 
              select NAME as contry_name, null 
                from V_COUNTRY_TEST3
              order by 1)
      ) t1
      
order by la     


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
V	COUNTRY_NAME	        LA
1	АВСТРАЛИЯ	        10
2	АВСТРИЯ	                20
3	АЗЕРБАЙДЖАН	        30
4	АЛБАНИЯ	                30.04
5	АЛЖИР	                30.05
6	АМЕРИКАНСКОЕ САМОА	30.06
7	АНГИЛЬЯ	                30.07
9	АНДОРРА	                40
10	АНТИГУА И БАРБУДА	40.1
8	АНГОЛА	                50
11	АРГЕНТИНА	        60
12	АРМЕНИЯ	                70
13	АРУБА	                80
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39706770
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLStax,

А зачем так много текста? или я что-то не понял или хватит и такого (т.е. у автора есть 80% запроса, ну и добавить 2 строчки)


вставте данные 2 (несколько) раз

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
  1  with VD_DATA_COPY3 as (select 'АВСТРАЛИЯ' name, 10 ORDER_NUM from dual union all
  2  select 'АВСТРИЯ',20 from dual union all
  3  select 'АЗЕРБАЙДЖАН',30 from dual union all
  4  select 'АНДОРРА',40 from dual union all
  5  select 'АНГОЛА',50 from dual union all
  6  select 'АРГЕНТИНА',60 from dual union all
  7  select 'АРМЕНИЯ',70 from dual union all
  8  select 'АЛБАНИЯ',30.04 from dual union all
  9  select 'АЛЖИР',30.05 from dual union all
 10  select 'АМЕРИКАНСКОЕ САМОА',30.06 from dual union all
 11  select 'АНГИЛЬЯ',30.07 from dual union all
 12  select 'АРУБА',80 from dual
 13  )
 14  , V_COUNTRY_TEST3(name) as (
 15  --select 'АВСТРАЛИЯ' name  from dual union all
 16  select 'АЛБАНИЯ1' name from dual union all
 17  --select 'АЛЖИР1' from dual union all
 18  --select 'АМЕРИКАНСКОЕ САМОА1' from dual union all
 19  --select 'АНГИЛЬЯ1' from dual union all
 20  select 'АЛБ07' from dual union all
 21  select 'АЛБ08' from dual union all
 22  select 'АЛБ09' from dual union all
 23  select 'АНТИГУА И БАРБУДА1' from dual)
 24  select v, country_name, nvl(num, lag(num,1,0) ignore nulls over (order by country_name)+(v/power(10,length(cnt))) ) la
 25  from (select rownum as v, country_name, num, count(*) over (order by null) cnt
 26          from (select NAME as country_name, ORDER_NUM as num
 27                  from VD_DATA_COPY3
 28               /*where (   TMPL_ROW_ID = 3222
 29                        OR TMPL_ROW_ID = 3223
 30                        OR TMPL_ROW_ID = 3224
 31                        OR TMPL_ROW_ID = 3225)
 32                       AND t055_id = 1952
 33                       AND ORDER_NUM not in (1340, 1350, 1360)*/
 34                union
 35                select NAME as contry_name, null
 36                  from V_COUNTRY_TEST3
 37                order by 1)
 38        ) t1
 39* order by la
SQL> /

         V COUNTRY_NAME               LA
---------- ------------------ ----------
         1 АВСТРАЛИЯ                  10
         2 АВСТРИЯ                    20
         3 АЗЕРБАЙДЖАН                30
         4 АЛБАНИЯ                 30,04
         9 АЛЖИР                   30,05
        10 АМЕРИКАНСКОЕ САМОА      30,06
        11 АНГИЛЬЯ                 30,07
         5 АЛБАНИЯ1                30,09
         6 АЛБ07                    30,1
         7 АЛБ08                   30,11
         8 АЛБ09                   30,12
        13 АНДОРРА                    40
        14 АНТИГУА И БАРБУДА1      40,14
        12 АНГОЛА                     50
        15 АРГЕНТИНА                  60
        16 АРМЕНИЯ                    70
        17 АРУБА                      80

17 rows selected.



ps
я сразу написал что возможно со старт-оф-гроуп будет проще

....
stax
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39723374
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Спасибо большое!
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39723375
zorlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zorlo,

Все решения помогли!
Спасибо огромное всем за помощь!
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39723587
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде все просто и последовательно решается

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
with src_v (country_name, num) AS (
select 'АВСТРАЛИЯ'   ,10 from dual union all
select 'АВСТРИЯ'     ,20 from dual union all
select 'АЗЕРБАЙДЖАН' ,30 from dual union all
select 'АНДОРРА'     ,40 from dual union all
select 'АНГОЛА'      ,50 from dual union all
select 'АРГЕНТИНА'   ,60 from dual union all
select 'АРМЕНИЯ'     ,70 from dual union all
select 'АРУБА'       ,80 from dual union all
select 'АЛБАНИЯ'           , null from dual union all
select 'АЛЖИР'             , null from dual union all
select 'АМЕРИКАНСКОЕ САМОА', null from dual union all
select 'АНГИЛЬЯ'           , null from dual union all
select 'А'                 , null from dual union all
select 'АA'                , null from dual union all
select 'АAA'               , null from dual union all
select 'АНТИГУА И БАРБУДА' , null from dual
),
t1 as (
select row_number() over (order by country_name) v, country_name, num
from src_v
),
t as (
select t1.*, last_value(num) ignore nulls over (order by v) lv from t1
)
select t.*,
       row_number() over (partition by num, lv order by v),
       nvl(num, nvl(LV, 0) + row_number() over (partition by num, lv order by v)) new_num
from t
order by v
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39723599
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJunior,

и не говори, понапридумывали тут

Код: plsql
1.
2.
3.
4.
5.
6.
select 'АМЕРИКАНСКОЕ САМОА1', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА2', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА3', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА4', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА5', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА6', null from dual union all
...
Рейтинг: 0 / 0
Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
    #39723791
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
envи не говори, понапридумывали тут

Автор в курсе что у него максимум 9 стран можно вставить между соседними при условии что num целое, можно подредактировать:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
with src_v (country_name, num) AS (
select 'АВСТРАЛИЯ'   ,10 from dual union all
select 'АВСТРИЯ'     ,20 from dual union all
select 'АЗЕРБАЙДЖАН' ,30 from dual union all
select 'АНДОРРА'     ,40 from dual union all
select 'АНГОЛА'      ,50 from dual union all
select 'АРГЕНТИНА'   ,60 from dual union all
select 'АРМЕНИЯ'     ,70 from dual union all
select 'АРУБА'       ,80 from dual union all
select 'АЛБАНИЯ'           , null from dual union all
select 'АЛЖИР'             , null from dual union all
select 'АМЕРИКАНСКОЕ САМОА', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА1', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА2', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА3', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА4', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА5', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА6', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА7', null from dual union all
select 'АМЕРИКАНСКОЕ САМОА8', null from dual union all
select 'АНГИЛЬЯ'           , null from dual union all
select 'А'                 , null from dual union all
select 'АA'                , null from dual union all
select 'АAA'               , null from dual union all
select 'Бла'               , null from dual union all
select 'Бла бла'           , null from dual union all
select 'Бла бла бла'       , null from dual union all
select 'АНТИГУА И БАРБУДА' , null from dual
),
t1 as (
select row_number() over (order by country_name) v, country_name, num
from src_v
),
t2 as (
select t1.*,
       last_value(num) ignore nulls over (order by v) lv,
       last_value(num) ignore nulls over (order by v range between unbounded preceding and unbounded following) max_num
from t1
),
t as (
select t2.*, row_number() over (partition by num, lv order by v) new_rn from t2
)
select t.*, 
       case when lv = max_num
       then nvl(num, LV + new_rn*10)
       else case when new_rn < 10
            then nvl(num, nvl(LV, 0) + new_rn)
            else -nvl(LV, 0)*100-new_rn
            end
       end as new_num
from t
order by v


Что делать с минусовыми пусть сам придумывает
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Добавить новые значения, отсортировнные по id между старых значений, отсортированных по id
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]