powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / супир иерархия
25 сообщений из 33, страница 1 из 2
супир иерархия
    #39384434
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добрый день !

подскажите пожалуйста,

эх..

есть например набор

ord level blabla
1 1 a
2 2 b
3 1 c
4 2 d
5 2 t
6 3 jz
7 3 z
8 3 i
нужно выбрать для каждой строки набор c вышестоящим level , например для
7 3 z

нужно выбрать строки
5 2 t
3 1 c


и результат вывести в одну строку 7 3 z t c

это же при помощи аналитической функции lead ?
...
Рейтинг: 0 / 0
супир иерархия
    #39384435
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ord- уникальный сквозной
...
Рейтинг: 0 / 0
супир иерархия
    #39384452
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в функции lag есть параметр, задающий смещение

к примеру:
LAG(dim_recname,2, null) OVER(ORDER BY ord, level) prev_code

выведет значение на две строки выше, если таког нет- вставит null

теперь как вот подзапросом в колонке селекта вывести в одну строку данные по всем вышестоящим level (( то есть как -то вычислить , сколько их и передать параметр смещения ((

не могу сообразить(
...
Рейтинг: 0 / 0
супир иерархия
    #39384457
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
listagg() within group()
...
Рейтинг: 0 / 0
супир иерархия
    #39384458
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
Код: plsql
1.
listagg() within group()



вообще ничего в интернете не могу найти про listagg
...
Рейтинг: 0 / 0
супир иерархия
    #39384460
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
Код: plsql
1.
listagg() within group()



и она же записывает в строку

а я пока не пойму, как сгруппировать ))
...
Рейтинг: 0 / 0
супир иерархия
    #39384461
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ozornitcaнужно выбрать строки
5 2 t
3 1 cпочему именно 5, а не 4 или 2? Почему 3, а не 1? Оригинальный запрос покажи, который дает тебе такой набор
...
Рейтинг: 0 / 0
супир иерархия
    #39384463
гречка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ozornitca, с таким заголовком темы, тебе место на кухне.
...
Рейтинг: 0 / 0
супир иерархия
    #39384464
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

запроса нет. это данные в таблице

данные только отсортированы asc ord,level


суть в том, что так организована иерархия у них

level- показывает уровень
ord- номер строки


итого берем к примеру
набор

ord level blabla
1 1 a
2 2 b
3 1 c
4 2 d
5 2 t
6 3 jz
7 3 z
8 3 i


смотрим для строки
7 3 z

для него ближайший первый верхний уровень строка
5 2 t (максимальный ord. level -1)

следующий ближайший опять с максимальныс ord и level-1 :
3 1 c
...
Рейтинг: 0 / 0
супир иерархия
    #39384465
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гречкаOzornitca, с таким заголовком темы, тебе место на кухне.

идите в ж***
...
Рейтинг: 0 / 0
супир иерархия
    #39384468
Клизма
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ozornitcaидите в ж***
Вот не люблю когда представители женского поля позволяют себе такие выражения. Всегда представляю как она при этом снимает трусы, встает раком и приглашает меня войти в свою ж***.
...
Рейтинг: 0 / 0
супир иерархия
    #39384469
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пф...
...
Рейтинг: 0 / 0
супир иерархия
    #39384470
Клизма
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ozornitcaпф...
Фу, ты еще и пукаешь.
...
Рейтинг: 0 / 0
супир иерархия
    #39384473
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Клизма,

мне с вами говорить не о чем

двери открыты- выходите

пс: форум не для ролевых фантазий, если кто вдруг не заметил
тут серьезный форум о БД и сопутствующем
...
Рейтинг: 0 / 0
супир иерархия
    #39384483
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ozornitcaсупир иерархия

Очень надеюсь это банальная ичепятка. По вопросу:

Код: 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.
with r(
       ord,
       lvl,
       blabla,
       prev_ord,
       prev_lvl
      ) as (
             select  ord,
                     lvl,
                     blabla,
                     ord - 1,
                     lvl - 1
               from  tbl
               where ord = &ord
            union all
             select  r.ord,
                     r.lvl,
                     case t.lvl
                       when r.prev_lvl then r.blabla || ' ' || t.blabla
                       else r.blabla
                     end,
                     t.ord - 1,
                     case t.lvl
                       when r.prev_lvl then t.lvl - 1
                       else r.prev_lvl
                     end
               from  r,
                     tbl t
               where r.prev_lvl > 0
                 and t.ord = r.prev_ord
           )
select  ord,
        lvl,
        blabla
  from  r
  where prev_lvl = 0
/
Enter value for ord: 7
old  14:                where ord = &ord
new  14:                where ord = 7

        ORD         LVL BLABLA
----------- ----------- ---------------
          7           3 z t c

SQL> 



SY.
...
Рейтинг: 0 / 0
супир иерархия
    #39384495
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYOzornitcaсупир иерархия

Очень надеюсь это банальная ичепятка. По вопросу:

Код: 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.
with r(
       ord,
       lvl,
       blabla,
       prev_ord,
       prev_lvl
      ) as (
             select  ord,
                     lvl,
                     blabla,
                     ord - 1,
                     lvl - 1
               from  tbl
               where ord = &ord
            union all
             select  r.ord,
                     r.lvl,
                     case t.lvl
                       when r.prev_lvl then r.blabla || ' ' || t.blabla
                       else r.blabla
                     end,
                     t.ord - 1,
                     case t.lvl
                       when r.prev_lvl then t.lvl - 1
                       else r.prev_lvl
                     end
               from  r,
                     tbl t
               where r.prev_lvl > 0
                 and t.ord = r.prev_ord
           )
select  ord,
        lvl,
        blabla
  from  r
  where prev_lvl = 0
/
Enter value for ord: 7
old  14:                where ord = &ord
new  14:                where ord = 7

        ORD         LVL BLABLA
----------- ----------- ---------------
          7           3 z t c

SQL> 



SY.

спасибо!

правда. запрос совсем не работает

там не надо RECURSIVE?

case t.lvl
when r.prev_lvl then r.blabla || ' ' || t.blabla
else r.blabla

синтаксис же case when условие then результат

и я не пойму почему иерархическим запросом все-таки, там же нестандартная иерархия
...
Рейтинг: 0 / 0
супир иерархия
    #39384496
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,
вообще честно говоря очень странный вы написали запрос
...
Рейтинг: 0 / 0
супир иерархия
    #39384497
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и вообще это не оракловый синтаксис,

мне на самом деле надо постгресс скул,

но у вас как будто не совсем постгресскул, но и не оракл- там коннект бай
...
Рейтинг: 0 / 0
супир иерархия
    #39384502
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OzornitcaSY,
вообще честно говоря очень странный вы написали запрос

Этот "очень странный запрос" называется recursive subquery factoring .

А если на самом деле надо постгресс скул то зачем писать на деревню дедушке?

SY.
...
Рейтинг: 0 / 0
супир иерархия
    #39384505
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYOzornitcaSY,
вообще честно говоря очень странный вы написали запрос

Этот "очень странный запрос" называется recursive subquery factoring .

А если на самом деле надо постгресс скул то зачем писать на деревню дедушке?

SY.

на том форуме пока не ответили )

чтобы принцип понять перенести его в постгрескл)

и у меня он пишет что что-то у него не рекурсивное Cast the output of the non-recursive term to the correct type.
...
Рейтинг: 0 / 0
супир иерархия
    #39384514
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,
я не пойму просто,

это же не обычный рекурсивный запрос ?
для рекурсии должен быть столбец, значение которогог равно значению вышестоящей строки

а в моем случае такого столбца-родителя нет


то есть у вас запрос как бы цикл по произвольному условию ?

я тормоз :(
не понимаю
...
Рейтинг: 0 / 0
супир иерархия
    #39384535
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ozornitcaдля рекурсии должен быть столбец, значение которогог равно значению вышестоящей строки


Для рекурсии дoлжна быть формула как из текущeго сдeлать следующее. У тебя следующее это ORD - 1. Начинаем с:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
             select  ord,
                     lvl,
                     blabla,
                     ord - 1,
                     lvl - 1
               from  tbl
               where ord = &ord



Затем добавляем (через UNION ALL) предыдущий ORD:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
             select  r.ord,
                     r.lvl,
                     case t.lvl
                       when r.prev_lvl then r.blabla || ' ' || t.blabla
                       else r.blabla
                     end,
                     t.ord - 1,
                     case t.lvl
                       when r.prev_lvl then t.lvl - 1
                       else r.prev_lvl
                     end
               from  r,
                     tbl t
               where r.prev_lvl > 0
                 and t.ord = r.prev_ord



и если LVL = предыдущий LVL - 1 то конкатенируем BLABLA. Остнавливаемся когда предыдущий LVL = 0.

SY.
...
Рейтинг: 0 / 0
супир иерархия
    #39384541
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYOzornitcaдля рекурсии должен быть столбец, значение которогог равно значению вышестоящей строки


Для рекурсии дoлжна быть формула как из текущeго сдeлать следующее. У тебя следующее это ORD - 1. Начинаем с:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
             select  ord,
                     lvl,
                     blabla,
                     ord - 1,
                     lvl - 1
               from  tbl
               where ord = &ord



Затем добавляем (через UNION ALL) предыдущий ORD:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
             select  r.ord,
                     r.lvl,
                     case t.lvl
                       when r.prev_lvl then r.blabla || ' ' || t.blabla
                       else r.blabla
                     end,
                     t.ord - 1,
                     case t.lvl
                       when r.prev_lvl then t.lvl - 1
                       else r.prev_lvl
                     end
               from  r,
                     tbl t
               where r.prev_lvl > 0
                 and t.ord = r.prev_ord



и если LVL = предыдущий LVL - 1 то конкатенируем BLABLA. Остнавливаемся когда предыдущий LVL = 0.

SY.

у меня по идее предыдущее - не именно ord-1 , а при условии , что текущий level<> предыдущему левелу, и первое предыдущее значение нужно брать с level-1 и максимальным для этой группы ord (при этом данные в исходной выорке из таблицы должны быть отсортированы по ord,level asc)
...
Рейтинг: 0 / 0
супир иерархия
    #39384542
Фотография Ozornitca
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,
аа сори сори вы написали про левел минус 1
...
Рейтинг: 0 / 0
супир иерархия
    #39384547
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иерархический SQL:

Код: 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.
select  connect_by_root ord ord,
        connect_by_root lvl lvl,
        regexp_replace(
                       sys_connect_by_path(
                                           case lvl
                                             when prior lvl then null
                                             else blabla
                                           end,
                                           ' '
                                          ),
                       '(^| ) *',
                       '\1'
                      ) blabla
  from  tbl
  where connect_by_isleaf = 1
  start with ord = &ord
  connect by ord = prior ord - 1
         and prior lvl != 1
/
Enter value for ord: 7
old  16:   start with ord = &ord
new  16:   start with ord = 7

        ORD         LVL BLABLA
----------- ----------- ---------------
          7           3 z t c

SQL> 



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


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