postgreSQL中的组合 - 选择对

时间:2015-11-06 15:07:48

标签: postgresql combinatorics binomial-coefficients

我有一张桌子,我想选择所有独特的对。很难说出这个问题而没有听起来像我只需要select distinct所以我会写出所需的输出和每个可能的组合。

enter image description here

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

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

Pair3:(2,5)和(3,6)

这与二项式系数相同:

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

理想情况下,输出看起来像:

enter image description here

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

1 个答案:

答案 0 :(得分:3)

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

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)