Комбинаторика в postgreSQL - выбор пар
У меня есть таблица ниже, и я хотел бы выбрать все уникальные пары. Трудно сформулировать эту проблему, не говоря, что мне просто нужно select distinct
поэтому я выпишу желаемый результат и каждую возможную комбинацию.
Пара1: (1,4) и (2,5)
Пара2: (1,4) и (3,6)
Пара3: (2,5) и (3,6)
Это то же самое, что и биномиальный коэффициент:
n Выберите r, где n = 3 и k = 2.
В идеале вывод будет выглядеть примерно так:
Честно говоря, я не знаю, с чего начать, поэтому, пожалуйста, извините, что нет первой попытки.
1 ответ
Решение
Используйте самостоятельное соединение с условиями, устраняющими дубликаты:
create table a_table (cola int, colb int);
insert into a_table values
(1, 4), (2, 5), (3, 6);
select *
from a_table a
join a_table b
on a.cola < b.cola and a.colb <> b.colb;
cola | colb | cola | colb
------+------+------+------
1 | 4 | 2 | 5
1 | 4 | 3 | 6
2 | 5 | 3 | 6
(3 rows)
Приведенный выше запрос работает хорошо, если столбец cola
уникален Если значения cola
можно повторить, следует добавить дополнительное условие:
insert into a_table values (1, 8);
select *
from a_table a
join a_table b
on a.cola < b.cola and a.colb <> b.colb
or a.cola = b.cola and a.colb < b.colb
order by 1, 2;
cola | colb | cola | colb
------+------+------+------
1 | 4 | 2 | 5
1 | 4 | 3 | 6
1 | 4 | 1 | 8
1 | 8 | 2 | 5
1 | 8 | 3 | 6
2 | 5 | 3 | 6
(6 rows)