我目前有一个SQL查询,该查询创建以下输出:
+---------+----------+
| Project | ID |
+---------+----------+
| X | Tom |
| X | Matt |
| X | Steve |
| Y | Richard |
| Y | Tom |
| Y | Garfield |
| Y | Katie |
+---------+----------+
我需要将其调整为如下所示:
+---------+---------+------+----------+-------+--+
| Project | ID | ID1 | ID2 | ID3 | |
+---------+---------+------+----------+-------+--+
| X | Tom | Matt | Steve | | |
| Y | Richard | Tom | Garfield | Katie | |
+---------+---------+------+----------+-------+--+
背景是我有一个由服务器生成的事件表,以及一个按项目具有特定权限级别的用户表。如果将它们合并,则事件表的大小会爆炸,稍后在工作流中,记录数将用于某些方面。因此,我只想使用project作为键,并以具有特定权限级别的用户列表作为附加列。
最大的困难是,这是动态的,因为重新分配了权限并创建/删除了项目。
答案 0 :(得分:0)
确实不能。在SQL中,返回的列数由您发送的查询定义,而不是结果集本身定义。
但是,您可以使用一个数组(=单列中的变量数目可变)。使用以下作为子查询:
SELECT project, array_agg(id)
FROM T
GROUP BY project
答案 1 :(得分:0)
您可以尝试使用conditional aggregation
select project,
max(case when rn=1 then id end) as ID,
max(case when rn=2 then id end) ID1,
max(case when rn=3 then id end) as ID2,
max(case when rn=4 then id end) as ID3
from
(
select Project,id, row_number() over(partition by project order by null) as rn
from tablename
)A group by project
输出:
project id id1 id2 id3
X Tom Steve Matt
Y Katie Richard Garfield Tom