Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Наборы уникальных комбинаций / 15 сообщений из 15, страница 1 из 1
08.11.2018, 15:07
    #39729980
mnemolog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
Добрый день

Как можно получить набор уникальных комбинаций?
with t as (
select 1 id from dual
union all
select 2 from dual
union all
select 3 from dual
union all
select 4 from dual
)
select * from t t1,t t2 where t1.id < t2.id

1 2
1 3
1 4
2 3
2 4
3 4

Желаемы результат:
1я-группа:
1 2
2 4
2я-группа:
1 3
2 4
3я-группа:
1 4
2 3

элементов может быть больше 4

Спасибо
...
Рейтинг: 0 / 0
08.11.2018, 15:34
    #39730000
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
mnemolog,

Мы не телепаты, мы просто переводчики с языка логики на SQL.
Опишите логику, согласно которой, строки должны попадать в ту или иную группу.
...
Рейтинг: 0 / 0
08.11.2018, 15:44
    #39730005
mnemolog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
Dshedoo,

В группу попадают все уникальные значения в комбинациях, то есть:
для 1й зруппы:
уникальны 1 2 и 3 4 (ошибся, написал 2 вместо 3х)
для 2й:
1 3 и 2 4 - элементы не повторяются, всего два сочетания
...
Рейтинг: 0 / 0
08.11.2018, 16:15
    #39730021
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
golomenmЖелаемы результатОсталось пояснить, что является исходными данными.
...
Рейтинг: 0 / 0
08.11.2018, 16:21
    #39730026
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
-2-golomenmЖелаемы результатОсталось пояснить, что является исходными данными.
Я пока не понял даже что именно хочет ТС - комбинации, сочетания или перестановки?
...
Рейтинг: 0 / 0
08.11.2018, 16:34
    #39730035
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
andrey_anonymousЯ пока не понял даже что именно хочет ТС - комбинации, сочетания или перестановки?Сочетание перестановок!
Вероятно группу образует максимальное количество пар с соблюдением сквозной уникальности элементов. Задача - получить все такие группы.
Однако не понятно, является ли первичным линейный список или непосредственно пары. Во втором случае получается возможна комбинация (1,2),(3,4),(5,6),(7,8). Которая образует единственную группу из четырех пар.
...
Рейтинг: 0 / 0
08.11.2018, 16:37
    #39730038
mnemolog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
andrey_anonymous,

Комбинации уже есть.
Данные можно сгенирировать (элементы - возрастающая последовательность натуральных чисел):

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as (
select 1 id from dual
union all 
select 2 from dual
union all
select 3 from dual
union all
select 4 from dual
)
select * from t t1,t t2 where t1.id < t2.id




Результат:

t1.idt2.id121314232434



Необходимо получить группы уникальных комбинаций, все элементы должны быть уникальны в рамках группы
Из приведенных выше данных должно получится 3 группы:

t1.idt2.id1234

t1.idt2.id1324
t1.idt2.id1423
...
Рейтинг: 0 / 0
08.11.2018, 17:04
    #39730048
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
mnemolog,

Я так понимаю основная фишка в том, что если вторая пара уже была использована в одной из групп, то больше она использована быть не может.
Код: 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.
SQL> with t(id) as (
  2  select 1 from dual
  3  union all
  4  select 2 from dual
  5  union all
  6  select 3 from dual
  7  union all
  8  select 4 from dual
  9  union all
 10  select 5 from dual
 11  )
 12  , tt as
 13  (select row_number() over (order by t1.id, t2.id) rn,
 14         t1.id x,
 15         t2.id y
 16    from t t1, t t2
 17   where t1.id < t2.id)
 18  , r(rn, x, y, x0, y0, allocated) as
 19  (
 20  select tt.rn,
 21         tt.x,
 22         tt.y,
 23         (select min(x) keep (dense_rank first order by t0.rn)
 24            from tt t0
 25           where tt.rn < t0.rn and tt.x not in (t0.x, t0.y) and tt.y not in (t0.x, t0.y)),
 26         (select min(y) keep (dense_rank first order by t0.rn)
 27            from tt t0
 28           where tt.rn < t0.rn and tt.x not in (t0.x, t0.y) and tt.y not in (t0.x, t0.y)),
 29         ku$_vcnt('~')
 30    from tt
 31   where rn = 1
 32  union all
 33  select tt.rn,
 34         tt.x,
 35         tt.y,
 36         (select min(x) keep (dense_rank first order by t0.rn)
 37            from tt t0
 38           where tt.rn < t0.rn and tt.x not in (t0.x, t0.y) and tt.y not in (t0.x, t0.y)
 39             and t0.x || '~' || t0.y not member of allocated multiset union ku$_vcnt(r.x0 || '~' || r.y0)),
 40         (select min(y) keep (dense_rank first order by t0.rn)
 41            from tt t0
 42           where tt.rn < t0.rn and tt.x not in (t0.x, t0.y) and tt.y not in (t0.x, t0.y)
 43             and t0.x || '~' || t0.y not member of allocated multiset union ku$_vcnt(r.x0 || '~' || r.y0)),
 44         allocated multiset union ku$_vcnt(r.x0 || '~' || r.y0)
 45    from tt
 46    join r on tt.rn = r.rn + 1
 47  )
 48  select x, y, x0, y0
 49    from r
 50   where x0 is not null;

         X          Y         X0         Y0
---------- ---------- ---------- ----------
         1          2          3          4
         1          3          2          4
         1          4          2          3
         2          3          4          5
         2          4          3          5



Это решение для версии 11gR2.
На 12с+ можно использовать cross apply/lateral вместо скаляров.

Еще решается моделью.
...
Рейтинг: 0 / 0
08.11.2018, 17:38
    #39730076
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
mnemolog,

для 5-ти как будет?
Код: 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.
 1  with t as (
 2  select 1 id from dual
 3  union all
 4  select 2 from dual
 5  union all
 6  select 3 from dual
 7  union all
 8  select 4 from dual
 9  union all
10  select 5 from dual
11  --union all
12  --select 4 from dual
13  )
14* select * from t t1,t t2 where t1.id < t2.id
QL> /

       ID         ID
--------- ----------
        1          2
        1          3
        1          4
        1          5
        2          3
        2          4
        2          5
        3          4
        3          5
        4          5

0 rows selected.



напр для 1 2

группы
1 2
3 4

или
1 2
3 5

или
1 2
4 5
какую брать ?

зи
недавно пятничная задачка похожая была

.....
stax
...
Рейтинг: 0 / 0
08.11.2018, 17:46
    #39730082
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
Кобанчегесли вторая пара уже была использована в одной из групп, то больше она использована быть не можетСтранный критерий "вторая" в неупорядоченном множестве. Последняя пара, естественно никогда не повторяется, потому что полностью зависима от предшествующих (остаток из). Но в наборе, полученном из чисел 1-4 и первая пара получается единственной в группе как предстаток от остатка.
...
Рейтинг: 0 / 0
08.11.2018, 17:47
    #39730083
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
Кобанчег,

я так понимаю в группе не обязательно две пары,
напр для n=6 допустимая группа
1 2
3 4
5 6

.....
stax
...
Рейтинг: 0 / 0
08.11.2018, 17:54
    #39730085
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
mnemolog,

сгенерить всевозможные перестановки 1 2 3 4 ... n (n!)
із них нарезать пары (по два значения)

.....
stax
...
Рейтинг: 0 / 0
08.11.2018, 17:57
    #39730088
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
-2-Кобанчегесли вторая пара уже была использована в одной из групп, то больше она использована быть не можетСтранный критерий "вторая" в неупорядоченном множестве. Последняя пара, естественно никогда не повторяется, потому что полностью зависима от предшествующих (остаток из). Но в наборе, полученном из чисел 1-4 и первая пара получается единственной в группе как предстаток от остатка.Если мы составляем пары из множесва уникальных чисел, то эти пары можно упорядочить.
Автор получил пары путем self join, но этого же можно было достичь с помощью powermultiset_by_cardinality(..., 2), не суть.

Касаемо "переиспользования", то пара (2, 3) не может быть использована для (1, 5), поскольку уже задействована для (1, 4).
Ну это моё понимание задачи ТС.
Если же "переиспользование" возможно, то простой self join пар поможет достичь цели.
...
Рейтинг: 0 / 0
09.11.2018, 01:33
    #39730247
SkilledJunior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with t  as (select level id from dual connect by level <= :n)
    ,tt as (select t1.id a1,
                   t2.id a2
            from t t1,t t2
            where t1.id < t2.id)
    ,r  as (select tt1.a1 a11,
                   tt1.a2 a12,
                   tt2.a1 a21,
                   tt2.a2 a22,
                   row_number() over (order by tt1.a1, tt1.a2, tt2.a1, tt2.a2) gr
            from tt tt1, tt tt2
            where tt2.a1 >  tt1.a1 and
                  tt1.a1 != tt2.a2 and
                  tt1.a2 != tt2.a1 and
                  tt1.a2 != tt2.a2)
    ,m  as (select level l from dual connect by level <= 2)
select gr, decode(l, 1, a11, 2, a21) n1, decode(l, 1, a12, 2, a22) n2
from r, m
order by gr, l
...
Рейтинг: 0 / 0
09.11.2018, 07:04
    #39730266
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наборы уникальных комбинаций
Staxдля 5-ти как будет?Предположу, что при непереиспользовании пар "пятый" элемент выпадет в однопарные группы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
МНОГОРАЗ   или  ОДНОРАЗ
---------       ---------
1,2  3,4        1,2  3,4 
1,2  3,5        1,3  2,4 
1,2  4,5        1,4  2,3 
1,3  2,4        1,5      
1,3  2,5        2,5      
1,3  4,5        3,5      
1,4  2,3        4,5      
1,4  2,5 
1,4  3,5 
1,5  2,3 
1,5  2,4 
1,5  3,4 
2,3  4,5 
2,4  3,5 
2,5  3,4 
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Наборы уникальных комбинаций / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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