Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Вопрос про упорядочивание номеров  [new]
666555444
Guest
Есть запрос, который в упрощённом виде выглядит примерно так:
with t as
  (select 1 t_level, 1 has_children, 9953 id_users from dual union all
   select 3, null, 9629 from dual union all
   select 4, null, 9257 from dual)
select * from t
order by 1

В нём нужно сделать так, чтобы в поле t_level номера были упорядочены, то есть, чтобы после 1 было 2, а не 3 и т.д.

Я сделал так:
with t as
  (select 1 t_level, 1 has_children, 9953 id_users from dual union all
   select 3, null, 9629 from dual union all
   select 4, null, 9257 from dual)
select row_number() over (order by has_children, t.t_level) as counter,
  case when row_number() over (order by has_children, t.t_level)=1 then 1
       when t.t_level>=(lag(t.t_level) over (order by t.has_children, t.t_level)+1)
       then lag(t.t_level) over (order by t.has_children, t.t_level)+1
       else t.t_level end tek_level,
  t.id_users
from t
order by 1

получается:

Counter | tek_level | id_users
1 | 1 | 9953
2 | 2 | 9629
3 | 4 | 9257

Понятно, что можно прикрутить ещё один уровень вложенности, потом ещё один и т.д. Но это как-то неправильно. Как это сделать правильно?
26 май 11, 10:39    [10711257]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про упорядочивание номеров  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6697
Чем
ужно сделать так, чтобы в поле t_level номера были упорядочены, то есть, чтобы после 1 было 2, а не 3
отличается от
select row_number() over (order by t_level) t_level_new,
       t.*
from t
?

Постарайтесь внятно сформулировать свой вопрос, глядишь, и ответ сами найдёте.
26 май 11, 10:58    [10711380]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про упорядочивание номеров  [new]
100500
Member

Откуда:
Сообщений: 124
666555444,

Мой шар подсказывает, что автору нужно почитать про Hierarchical Queries в общем и про "ORDER SIBLINGS BY" в частности
26 май 11, 11:23    [10711586]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про упорядочивание номеров  [new]
666555444
Guest
Попрубую ещё раз объяснить. Есть дерево, и у него выводятся номера уровней. Но некоторые уровни отсутствуют из-за того, что были отсечены условиями выборки. Теперь нужно исправить нумерацию уровней таким образом, чтобы не было разрывов. В приведённом выше примере нет второго уровня.

Про start with .. connect by я знаю, но пока что у меня нет идей, как эту конструкцию использовать для решения этой задачи.
26 май 11, 11:39    [10711748]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про упорядочивание номеров  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
1)
 with t as (
select a.* 
      ,sys_connect_by_path(empno,',')  scp -- просто так
      ,regexp_replace(sys_connect_by_path(empno,','),',[^,]+$')  br
      ,rownum rr
  from scott.emp a
-- where job <> 'CLERK'
  start with mgr is null
  connect by prior empno = mgr
)
   select row_number() over (partition by br order by rr asc) r
         ,t.*
     from t
 order by rr; 
2) то же, но раскрыть комментарий
26 май 11, 12:43    [10712305]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про упорядочивание номеров  [new]
666555444
Guest
orawish, что-то у меня ерунда какая-то получается. А что там regexp_replace, по задумке должен делать?
На приведённом примере:

with t as (
select 1 t_level, 1 has_children, 9953 id_users, /*sys_connect_by_path(level,',')*/ ',1' scbp,
         null /*regexp_replace(sys_connect_by_path(level,','),',[^,]+$')*/ br, 3 /*rownum*/ rr
from dual union all 
select 3, null, 9629, ',1,2,3', ',1,2', 1 from dual union all 
select 4, null, 9257, ',1,2,3,4', ',1,2,3', 2 from dual)
select row_number() over (partition by br order by rr asc) r, t.*
from t
order by has_children, t_level

получается:

r | t_level | id_users
1 | 1 | 9953
1 | 2 | 9629
1 | 3 | 9257

Вот заготовка:
select row_number() over (partition by br order by rr asc) r, t.*
from
  (select u.*, level tek_level
    ,sys_connect_by_path(level,',') scp -- просто так
    ,regexp_replace(sys_connect_by_path(level,','),',[^,]+$')  br
    ,rownum rr
   from
   (select 9628 id_template, 9629 id_users from dual union all
    select 9623, 9628 from dual union all
    select null, 9623 from dual union all
    select 9253, 9257 from dual union all
    select 9221, 9253 from dual union all
    select 9150, 9221 from dual union all
    select null, 9150 from dual union all
    select null, 9953 from dual
   ) u
   where u.id_users in (9629, 9257, 9953)
   start with id_template is null
   connect by prior id_users = id_template) t
26 май 11, 15:05    [10713532]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про упорядочивание номеров  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
666555444
orawish, что-то у меня ерунда какая-то получается. А что там regexp_replace, по задумке должен делать?
..

не мудрено, что ерунда. level не надо под sys_connect_by_path совать
26 май 11, 15:15    [10713627]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про упорядочивание номеров  [new]
666555444
Guest
orawish
666555444
orawish, что-то у меня ерунда какая-то получается. А что там regexp_replace, по задумке должен делать?
..

не мудрено, что ерунда. level не надо под sys_connect_by_path совать


А что туда надо было совать?
26 май 11, 15:24    [10713726]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про упорядочивание номеров  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
666555444
orawish
пропущено...

не мудрено, что ерунда. level не надо под sys_connect_by_path совать


А что туда надо было совать?

тот реальный атрибут, по которому вы хотите поуровневой (а-ля subling) сортировки результата
26 май 11, 15:41    [10713930]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про упорядочивание номеров  [new]
666555444
Guest
orawish
тот реальный атрибут, по которому вы хотите поуровневой (а-ля subling) сортировки результата


Тут дело не в сортировке. Дело в том, что мне надо подправить номера уровней в дереве таким образом, чтобы они шли подряд. То есть, нужно убрать разрывы в нумерации уровней.
26 май 11, 15:44    [10713982]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про упорядочивание номеров  [new]
psn
Guest
666555444,

select dense_rank() over (order by t_level), t_level, id_users
  from t
  order by 1
26 май 11, 16:05    [10714217]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про упорядочивание номеров  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
666555444
orawish
тот реальный атрибут, по которому вы хотите поуровневой (а-ля subling) сортировки результата


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

насколько я понял -
..,regexp_replace(sys_connect_by_path(id_user,','),',[^,]+$')  br ..
26 май 11, 16:07    [10714231]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про упорядочивание номеров  [new]
666555444
Guest
psn
666555444,

select dense_rank() over (order by t_level), t_level, id_users
  from t
  order by 1


Большое спасибо! Так работает.
26 май 11, 16:25    [10714413]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить