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)
我下面有一个 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)