Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как выбрать топовые пути sql-ем / 22 сообщений из 22, страница 1 из 1
21.02.2017, 15:05
    #39408536
AlexVin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
oracle 12

в столбце есть неограниченное (1-n) небольшое количество путей к каталогам ос
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual
) 
select p from a


можно ли только sql-ем выбрать строки, исключив встречающиеся среди данных подкаталоги?
(в примере /opt1/baza/tut/ и /usr/local/lib/ в выборку попасть не должны)
...
Рейтинг: 0 / 0
21.02.2017, 15:13
    #39408547
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
AlexVinможно ли только sql-ем выбрать строки, исключив встречающиеся среди данных подкаталоги?Self join + not like
...
Рейтинг: 0 / 0
21.02.2017, 16:48
    #39408622
ln123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
AlexVin,

Код: plsql
1.
select p from a where not exists (select 1 from a a1 where a.p like a1.p||'%' and a.p != a1.p)
...
Рейтинг: 0 / 0
21.02.2017, 17:10
    #39408645
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
ln123,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual
) 
select p from a
 where p     like '/%/%/%' 
   and p not like '/%/%/_%';
...
Рейтинг: 0 / 0
21.02.2017, 17:11
    #39408647
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
AlexVinнеограниченное (1-n) небольшое количество путейjust for fun за одно сканирование
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual
) 
, b as (select p, regexp_substr(p, '(/[^/]+){' || level || '}') token
          from a
       connect by prior p = p and level < regexp_count(p, '/') and prior sys_guid() is not null)
, c as (select b.*, count(*) over (partition by p) cnt from b)
, d as (select c.*, min(cnt) over (partition by token) m from c)
select p
  from d
group by p
having min(cnt) = min(m)
order by 1
...
Рейтинг: 0 / 0
21.02.2017, 17:28
    #39408655
orawish
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
ещё баян
Код: plsql
1.
2.
select p from a
 where length(p)-length(replace (p,'/')) <= 3;
...
Рейтинг: 0 / 0
21.02.2017, 17:41
    #39408663
кто тут?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
dbms_photoshop just for fun

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with tst(path) as (
  select '/opt/base/'       from dual union all
  select '/opt/baza/'       from dual union all
  select '/op/baza/'        from dual union all
  select '/opt1/'           from dual union all
  select '/opt1/baza/tut/'  from dual union all
  select '/usr/local/'      from dual union all
  select '/usr/local/lib/'  from dual
) 
select path from 
(
select
  tst1.path, 
  count(tst1.path) over(partition by tst1.path) cnt
from       tst tst1
inner join tst tst2 on instr(tst1.path, tst2.path) <> 0
) where cnt = 1;
...
Рейтинг: 0 / 0
21.02.2017, 17:55
    #39408676
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
orawishещё баянОба "решения" неправильные даже если принимать, что глубина не более трех уровней.


кто тут?,
Может так лучше дойдет
dbms_photoshopjust for fun за одно сканирование (вместо connect by для "размножения строк" можно использовать множество других альтернатив)

А вообще, если максимальная вложенность заранее известна, то задача - частный случай Пятничная задачка. Схлопывание кортежей.
...
Рейтинг: 0 / 0
21.02.2017, 18:00
    #39408681
кто тут?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
dbms_photoshop, кто дойдет? куда? Я всего лишь использовал твою крутую фразу "just for fun" для своего решения.
И то, что я написал никак не претендует на "Оптимальное решение года". Извини.
...
Рейтинг: 0 / 0
21.02.2017, 18:21
    #39408696
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with tst(path) as (
  select '/opt/base/'       from dual union all
  select '/opt/baza/'       from dual union all
  select '/op/baza/'        from dual union all
  select '/opt1/'           from dual union all
  select '/opt1/baza/tut/'  from dual union all
  select '/opt1/baza/tut/1'  from dual union all
  select '/opt1/baza/tut/1/2'  from dual union all
  select '/usr/local/'      from dual union all
  select '/usr/local/lib/'  from dual
) 
select t1.path
from       tst t1
left join  tst t2 on t1.path like t2.path || '%' and t1.path != t2.path
where t2.path is null;
...
Рейтинг: 0 / 0
21.02.2017, 18:24
    #39408699
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
кто тут?,

Опубликованное мной тоже на оптимальность не претендует (хотя можно придумать данные для которых уход от само-соединения имеет смысл).
Цитирование обычно подразумевает, что ты обращаешься или комментируешь, если не сказано иное.
...
Рейтинг: 0 / 0
21.02.2017, 19:57
    #39408744
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
Попробовал match_recognize
Код: 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.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual union all
select '/usr/local/share/' p from dual
) 
select *
  from a 
  match_recognize(
     order by p  
     measures 
        strt.p start_p
     one row per match 
     after match skip past last row 
     pattern(strt down+ same* | strt down*) 
     define 
       down as down.p like prev(down.p)||'%'
      ,same as regexp_replace(same.p,'[^/]+\/$') = regexp_replace(prev(same.p),'[^/]+\/$') 
 ) mr
/
...
Рейтинг: 0 / 0
21.02.2017, 20:27
    #39408753
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
xtenderПопробовал match_recognize
Код: 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.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual union all
select '/usr/local/share/' p from dual
) 
select *
  from a 
  match_recognize(
     order by p  
     measures 
        strt.p start_p
     one row per match 
     after match skip past last row 
     pattern(strt down+ same* | strt down*) 
     define 
       down as down.p like prev(down.p)||'%'
      ,same as regexp_replace(same.p,'[^/]+\/$') = regexp_replace(prev(same.p),'[^/]+\/$') 
 ) mr
/

Лучше в логике использовать проверку "подкаталогов" на вхождение первой строки матча. Иначе результат может быть неверный.
Код: plsql
1.
2.
3.
4.
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual union all
select '/usr/local/lib/aaa/' p from dual union all
select '/usr/local/share/' p from dual
...
Рейтинг: 0 / 0
21.02.2017, 20:37
    #39408761
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
Код: plaintext
1.
pattern(x+)
define x as p like first(p) || '%'
...
Рейтинг: 0 / 0
21.02.2017, 20:43
    #39408766
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
dbms_photoshop
Код: plaintext
1.
pattern(x+)
define x as p like first(p) || '%'


Код: 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.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual union all
select '/usr/local/share/' p from dual
)
select *
  from a
  match_recognize(
     order by p
     measures
        first(p) start_p
     one row per match
     pattern(down+)
     define
       down as p like replace(replace(first(p),'_','\_'),'%','\%') || '%' escape '\'
 ) mr
/

START_P
-----------------
/op/baza/
/opt/base/
/opt/baza/
/opt1/
/usr/local/

SQL> 



Предолагается всe пути к каталогам имеют / в начале и в конце.

SY.
...
Рейтинг: 0 / 0
21.02.2017, 20:44
    #39408767
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
dbms_photoshop,

кстати, я правильно понимаю, что match_recognize не умеет ветвить цепочки от одного корня?
то есть нельзя получить из
/a/
/a/b/
/a/b/x
/a/c/
/a/c/y

2 цепочки:
/a/
/a/b/
/a/b/x
и
/a/
/a/c/
/a/c/y
?
...
Рейтинг: 0 / 0
21.02.2017, 21:25
    #39408780
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
xtenderкстати, я правильно понимаю, что match_recognize не умеет ветвить цепочки от одного корня?Можно регулировать старт указывая разные опции в
Код: plaintext
after match ...
Но старт в любом случае должен быть хотя бы на следующей строке.
Иначе словишь что-то в духе: ORA-ххххх текущий матч начинается там же где и предыдущий.
...
Рейтинг: 0 / 0
21.02.2017, 22:49
    #39408805
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
dbms_photoshop,

в твоей книге это не разъяснено :(
...
Рейтинг: 0 / 0
22.02.2017, 07:32
    #39408855
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
AmKad
Код: plsql
1.
t1.path like t2.path || '%' and t1.path != t2.path

Код: plsql
1.
  t1.path like t2.path || '_%'
...
Рейтинг: 0 / 0
22.02.2017, 11:03
    #39408951
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
xtenderdbms_photoshop,

в твоей книге это не разъяснено :(Была попытка выдержать баланс между объяснением возможности-ограничения и углублением в детали.
Конкретно этот момент проблематично сформулировать одним абзацем, чтоб понятно было тому, кто сам не сталкивался.
Некоторые дополнительные ограничения будут во второй части, где будет описано решение конкретных задач.
По мелочам, конечно, еще и первую часть "причешу" с учетом замечаний.
...
Рейтинг: 0 / 0
22.02.2017, 11:23
    #39408974
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
AlexVin,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with a as (
select '/opt/base/' p from dual union all
select '/opt/baza/' p from dual union all
select '/op/baza/' p from dual union all
select '/opt1/' p from dual union all
select '/opt1/baza/tut/' p from dual union all
select '/usr/local/' p from dual union all
select '/usr/local/lib/' p from dual
) 
select substr(p,1,instr(substr(p,2,100),'/')+1), count(*) from a
group by substr(p,1,instr(substr(p,2,100),'/')+1)
order by 2 desc
...
Рейтинг: 0 / 0
22.02.2017, 11:57
    #39409015
Фанат Elic-а
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как выбрать топовые пути sql-ем
Dshedoo, что это?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / как выбрать топовые пути sql-ем / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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