postgreSQL 中的组合学 - 选择对

Combinatorics in postgreSQL - selecting pairs

我下面有一个 table,我想 select 所有独特的对。很难在不听起来像我只需要 select distinct 的情况下表达这个问题,所以我会写出所需的输出和所有可能的组合。

第 1 对:(1,4) 和 (2,5)

对 2:(1,4) 和 (3,6)

第 3 对:(2,5) 和 (3,6)

这个和二项式系数是一样的:

n 选择 r,其中 n = 3,k = 2。

理想情况下,输出类似于:

老实说,我不知道从哪里开始,所以请原谅我没有第一次尝试。

使用带条件的自连接消除重复项:

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)