PostgreSQL 9.3:动态交叉表查询

PostgreSQL 9.3:动态交叉表查询,postgresql,pivot,crosstab,postgresql-9.3,Postgresql,Pivot,Crosstab,Postgresql 9.3,我对使用版本为9.3的PostgreSQL非常陌生 我有下表和一些记录: 示例: create table tst ( cola varchar(10), colc varchar(10) ) insert into tst values('101','A1'); insert into tst values('101','A2'); insert into tst values('201','A3'); insert into tst values('301','A4'); insert i

我对使用版本为9.3的PostgreSQL非常陌生

我有下表和一些记录:

示例

create table tst
(
cola varchar(10),
colc varchar(10)
)

insert into tst values('101','A1');
insert into tst values('101','A2');
insert into tst values('201','A3');
insert into tst values('301','A4');
insert into tst values('401','A1');
insert into tst values('101','A6');
insert into tst values('201','A1');
insert into tst values('201','A5'); 
注意:现在我只想显示
cola
属于
colc
值的记录。如果用户将
colc
值作为参数传递给函数,则它必须匹配
colc
所属的
cola
值的确切值

预期结果

create table tst
(
cola varchar(10),
colc varchar(10)
)

insert into tst values('101','A1');
insert into tst values('101','A2');
insert into tst values('201','A3');
insert into tst values('301','A4');
insert into tst values('401','A1');
insert into tst values('101','A6');
insert into tst values('201','A1');
insert into tst values('201','A5'); 
如果用户通过
A1、A2、A6
,则结果应为:

cola   A1   A2   A6
--------------------
101    1    1    1
cola   A1 
----------
401    1  
注意:在上述结果中,出现记录
101
,因为它属于
A1、A2、A6
而不是其他值<代码>201不会出现,因为它也属于
A1、A3
A5

如果用户通过
A1
,则结果应为:

cola   A1   A2   A6
--------------------
101    1    1    1
cola   A1 
----------
401    1  
注意:在上述结果中,出现记录
401
,因为它只属于
A1


我不知道如何在这个场景的函数中编写交叉表

服务器端函数在PostgreSQL中不能具有动态返回类型,因此无法从固定函数中获得所述结果

而且,它看起来也不像是一个典型的交叉表问题。输出的
cola
部分可以通过对聚合进行过滤获得,其他列
A1/A2/A6
实际上是输入,因此在客户端生成的查询上下文中,将它们作为列复制到输出中是很容易的

查找匹配行的实际SQL查询的要点如下:

select cola from ts
group by cola
having array_agg(colc order by colc)='{A1,A2,A6}'
这将找到
101

添加其他列只是一个客户端演示问题。例如,查询可以这样编写:

select cola, 1 as A1, 1 as A2, 1 as A6 from tst
group by cola
having array_agg(colc order by colc)='{A1,A2,A6}';
结果:

 cola | a1 | a2 | a6 
------+----+----+----
 101  |  1 |  1 |  1
请参考此答案