Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / супир иерархия / 25 сообщений из 33, страница 1 из 2
13.01.2017, 18:00
    #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
13.01.2017, 18:02
    #39384435
Ozornitca
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
супир иерархия
ord- уникальный сквозной
...
Рейтинг: 0 / 0
13.01.2017, 18:20
    #39384452
Ozornitca
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
супир иерархия
в функции lag есть параметр, задающий смещение

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

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

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

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



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



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

а я пока не пойму, как сгруппировать ))
...
Рейтинг: 0 / 0
13.01.2017, 18:35
    #39384461
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
супир иерархия
Ozornitcaнужно выбрать строки
5 2 t
3 1 cпочему именно 5, а не 4 или 2? Почему 3, а не 1? Оригинальный запрос покажи, который дает тебе такой набор
...
Рейтинг: 0 / 0
13.01.2017, 18:39
    #39384463
гречка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
супир иерархия
Ozornitca, с таким заголовком темы, тебе место на кухне.
...
Рейтинг: 0 / 0
13.01.2017, 18:40
    #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
13.01.2017, 18:41
    #39384465
Ozornitca
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
супир иерархия
гречкаOzornitca, с таким заголовком темы, тебе место на кухне.

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

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

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

пс: форум не для ролевых фантазий, если кто вдруг не заметил
тут серьезный форум о БД и сопутствующем
...
Рейтинг: 0 / 0
13.01.2017, 19:18
    #39384483
SY
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
13.01.2017, 20:02
    #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
13.01.2017, 20:04
    #39384496
Ozornitca
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
супир иерархия
SY,
вообще честно говоря очень странный вы написали запрос
...
Рейтинг: 0 / 0
13.01.2017, 20:06
    #39384497
Ozornitca
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
супир иерархия
и вообще это не оракловый синтаксис,

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

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

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

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

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

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

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

SY.

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

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

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

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

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


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

я тормоз :(
не понимаю
...
Рейтинг: 0 / 0
13.01.2017, 20:47
    #39384535
SY
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
13.01.2017, 20:55
    #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
13.01.2017, 20:57
    #39384542
Ozornitca
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
супир иерархия
SY,
аа сори сори вы написали про левел минус 1
...
Рейтинг: 0 / 0
13.01.2017, 21:03
    #39384547
SY
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / супир иерархия / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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