Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помоги решить такую интересную задачу / 19 сообщений из 19, страница 1 из 1
24.11.2017, 17:04
    #39559164
Mr.Brown
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
Нужно найти круг друзей , друг моего друга

Пример таблицы указан ниже,
Нужно найти круги друзей в которых есть общие друзья

СТОРОНА 1 | ДРУЗЬЯ........ |СТОРОНА 1 | ДРУЗЬЯ
______________________________________________________
КРУГ 1........| Борис,Артем | Круг 2......| Виктор,Артем
______________________________________________________
КРУГ 3........| Денис,Евгений | Круг 4......| Владимир,Станислав
______________________________________________________
КРУГ 2........| Виктор,Артем | Круг 5........|Андрей,Виктор

Как видно , из Круга 1 Артем есть в Круге 2
И при этом из Круга 2 Виктор есть в Круге 5 .

Т.е общие друзья Между кругом 1 и кругом 2 через Артема, и Кругом 2 и Кругом 5 через Виктора.
Соответственно Круги 1, Круг 2 и Круг 5 имеют общий друзей.

Нужно написать такой селект чтобы вывести такие круги друзей, и учитывать что имена друзей разделены запятой
Надеюсь смог объяснить
...
Рейтинг: 0 / 0
24.11.2017, 17:09
    #39559166
Mr.Brown
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
Прошу не обращать внимание на скриншот он не правильный, вот исправленный вариант
...
Рейтинг: 0 / 0
24.11.2017, 17:15
    #39559168
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
В проктостоматологии на криво спроектированной БД нет ничего интересного.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.11.2017, 17:26
    #39559171
Mr.Brown
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
Dimitry Sibiryakov,

Тоесть ?
...
Рейтинг: 0 / 0
24.11.2017, 17:33
    #39559172
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
Mr.BrownТоесть ?

Доведи базу до третьей нормальной формы и твой запрос станет тривиальным WITH
RECURSIVE/CONNECT BY.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.11.2017, 17:42
    #39559178
Mr.Brown
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
Dimitry Sibiryakov,

Прошу помочь, каким образом мне преобразовать мои данные в 3nf.
как он примерно должен выглядеть
...
Рейтинг: 0 / 0
24.11.2017, 17:58
    #39559186
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
Mr.BrownПрошу помочь, каким образом мне преобразовать мои данные в 3nf.
как он примерно должен выглядеть

Берёшь свой скриншотик, распечатываешь на бумаге.
У тебя 3 вертикальных полоски на напечатанном.
Берёшь ножницы и разрезаешь листик по средней вертикальной полоске.
Берёшь часть, где у тебя "сторона 2", и по первой сверху горизонтальной полоске отрезаешь.
Часть, где "Сторона 2", выкидываешь.
Молишься.
Оставшийся кусочек подклеиваешь снизу к части со "стороной 1", чтобы круги были под кругами, а друзья под друзьями.
Вуаля - ты сделяль!
Вот так примерно и должен выглядеть "он".
...
Рейтинг: 0 / 0
24.11.2017, 18:12
    #39559190
Mr.Brown
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
FogelMr.BrownПрошу помочь, каким образом мне преобразовать мои данные в 3nf.
как он примерно должен выглядеть

Берёшь свой скриншотик, распечатываешь на бумаге.
У тебя 3 вертикальных полоски на напечатанном.
Берёшь ножницы и разрезаешь листик по средней вертикальной полоске.
Берёшь часть, где у тебя "сторона 2", и по первой сверху горизонтальной полоске отрезаешь.
Часть, где "Сторона 2", выкидываешь.
Молишься.
Оставшийся кусочек подклеиваешь снизу к части со "стороной 1", чтобы круги были под кругами, а друзья под друзьями.
Вуаля - ты сделяль!
Вот так примерно и должен выглядеть "он".

Спасибо за юмор )
Это да, разобрался)) но как сохранить взаимосвязь между кругами?
В плане того что они имели связь между собой.
...
Рейтинг: 0 / 0
24.11.2017, 18:37
    #39559216
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
Mr.BrownСпасибо за юмор )
Это да, разобрался)) но как сохранить взаимосвязь между кругами?
В плане того что они имели связь между собой.

Это была сатира.

Используй силу Люк базу данных.
Вот база данных, которую использует Mr.Brown.
А вот таблица, которая в базе хранится, которую использует Mr.Brown.
А вот данные из скриншота, которые хранятся в таблице, которая в базе хранится, которую использует Mr.Brown.
А вот команда select, которая тянет данные, что на скриншоте, но из таблицы, которая в базе хранится, которую использует Mr.Brown.
А вот функция substr, которая выделяет друзей из кругов, которые выданы командой select, которая тянет данные, что на скриншоте, но из таблицы, которая в базе хранится, которую использует Mr.Brown.
А вот условие connect by, которое устанавливает связи друзей по кругам, которые получены функцией substr, которая выделяет друзей из кругов, которые выданы командой select, которая тянет данные, что на скриншоте, но из таблицы, которая в базе хранится, которую использует Mr.Brown.
...
Рейтинг: 0 / 0
24.11.2017, 19:10
    #39559239
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
Mr.BrownFogel...
Оставшийся кусочек подклеиваешь снизу к части со "стороной 1", чтобы круги были под кругами, а друзья под друзьями.
Вуаля - ты сделяль!
Вот так примерно и должен выглядеть "он".
Это да, разобрался))

По ходу Fogel тоже не особо разобрался что есть 3nf...
То, что продемонстрировано, не является даже 1nf
...
Рейтинг: 0 / 0
24.11.2017, 19:55
    #39559271
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
andrey_anonymousMr.Brownпропущено...

Это да, разобрался))

По ходу Fogel тоже не особо разобрался что есть 3nf...
То, что продемонстрировано, не является даже 1nf
Fogel - не читатель, Fogel - писатель.
...
Рейтинг: 0 / 0
24.11.2017, 20:57
    #39559286
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
Mr.Brown,

connected components: quick find quick union algorithm
Код: 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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
declare
   type char_array   is table of varchar2(20) index by varchar2(20);
   type arr_elems    is table of sys.ku$_vcnt index by varchar2(20);
   root              char_array;
   root_elems        arr_elems;

   n        varchar2(20);

    l integer:=dbms_utility.get_time();

    procedure print(v in varchar2) is
    begin
      dbms_output.put_line(to_char((dbms_utility.get_time-l)/100,'0999.99')||' '||v);
      l:=dbms_utility.get_time();
    end;

   
   function get_root(n varchar2) return varchar2 is
   begin
      if root.exists(n) then 
         return root(n);
      else 
         return null;
      end if;
   end;
   
   procedure update_root(old_root varchar2,new_root varchar2) is
      i pls_integer;
   begin
      if old_root!=new_root then 
         root_elems(new_root):=root_elems(new_root) multiset union all root_elems(old_root);
         for i in 1..root_elems(old_root).count
         loop
            root(root_elems(old_root)(i)):=new_root;
         end loop;
         root_elems(old_root).delete;
       end if;
   end;
   
   procedure add_elem(p_root varchar2, p_elem varchar2) is
   begin
      if not root_elems.exists(p_root) then
         root_elems(p_root):=sys.ku$_vcnt(p_elem);
      else
         root_elems(p_root).extend();
         root_elems(p_root)(root_elems(p_root).count):=p_elem;
      end if;
   end;
   
   procedure add_link(p varchar2,q varchar2) is
      r1       varchar2(20);
      r2       varchar2(20);
      new_root varchar2(20);
   begin
      r1:=get_root(p);
      r2:=get_root(q);
      
      if r1 is null or r2 is null then
         new_root := coalesce(r1,r2,p);
         if r1 is null then add_elem(new_root,p); root(p):=new_root; end if;
         if r2 is null then add_elem(new_root,q); root(q):=new_root; end if;
      else
         new_root:=least(r1,r2);
         root(p) :=new_root;
         root(q) :=new_root;
         update_root(greatest(r1,r2),new_root);
      end if;
      
   end;

begin
   print('start');
   for r in (
            with v(p,q) as (
              select 'Круг 1', 'Борис'     from dual union all
              select 'Круг 1', 'Артем'     from dual union all
              select 'Круг 3', 'Денис'     from dual union all
              select 'Круг 3', 'Евгений'   from dual union all
              select 'Круг 2', 'Виктор'    from dual union all
              select 'Круг 2', 'Артем'     from dual union all
              select 'Круг 4', 'Владимир'  from dual union all
              select 'Круг 4', 'Станислав' from dual union all
              select 'Круг 1', 'Андрей'    from dual union all
              select 'Круг 1', 'Виктор'    from dual
            )
            select *
            from v
   )
   loop
      add_link(r.p, r.q);
   end loop;
   print('processed');
   print('groups:');
   
   n:= root_elems.first();
   while n is not null loop
      for i in 1..root_elems(n).count loop
         dbms_output.put(','||root_elems(n)(i));
      end loop;
      dbms_output.put_line(' ');
      n:=root_elems.next(n);
   end loop;
end;


в выделенном подставляешь свой запрос с данными
...
Рейтинг: 0 / 0
24.11.2017, 21:11
    #39559290
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
xtender,

Там надо пару строчек закомментировать, чтобы в элементы группы не попадал рут
...
Рейтинг: 0 / 0
24.11.2017, 22:23
    #39559295
Fogel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
xtenderMr.Brown,
..
в выделенном подставляешь свой запрос с данными
Сначала красные прогнали белых из леса, потом белые прогнали красных из леса.
Потом пришёл лесник и всех выгнал )))
...
Рейтинг: 0 / 0
24.11.2017, 22:48
    #39559301
Mr.Brown
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
xtender,

Спасибо!

на чистом SQL возможно решить?
...
Рейтинг: 0 / 0
24.11.2017, 22:57
    #39559305
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
...
Рейтинг: 0 / 0
24.11.2017, 23:03
    #39559310
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
Mr.Brown,

решение Elic'a
Код: 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.
with test(clientid,accountid) as (
  select 'Круг 1', 'Борис'     from dual union all
  select 'Круг 1', 'Артем'     from dual union all
  select 'Круг 3', 'Денис'     from dual union all
  select 'Круг 3', 'Евгений'   from dual union all
  select 'Круг 2', 'Виктор'    from dual union all
  select 'Круг 2', 'Артем'     from dual union all
  select 'Круг 4', 'Владимир'  from dual union all
  select 'Круг 4', 'Станислав' from dual union all
  select 'Круг 1', 'Андрей'    from dual union all
  select 'Круг 1', 'Виктор'    from dual
)
select max(group_member_id) as group_max_id, clientid, accountid
  from
  ( select                 clientid  as group_member_id
         , connect_by_root accountid as accountid
         , connect_by_root clientid  as clientid
      from test
      connect by nocycle decode(accountid, prior accountid, 1, 0)
                       + decode(clientid,  prior clientid,  1, 0)
                       = 1
  )
  group by accountid, clientid
  order by group_max_id, clientid, accountid
;
...
Рейтинг: 0 / 0
26.11.2017, 23:12
    #39559729
Mr.Brown
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помоги решить такую интересную задачу
Спасибо за решение, как при этом в вытащить то что в Базе храниться в этом виде
КРУГ 1| Борис,Артем
...
Рейтинг: 0 / 0
27.11.2017, 01:09
    #39559741
Помоги решить такую интересную задачу
да ещё и ложками.
да что уж там ложками - поварёшками!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помоги решить такую интересную задачу / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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