PostgreSQL 9.3:动态交叉表查询
我对使用版本为9.3的PostgreSQL非常陌生 我有下表和一些记录: 示例: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
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
请参考此答案