我正在尝试编写一个查询,以根据特定键获取放置在一行上的表的值。
table.ID | table.ACCOUNT |
==================================
12345 | 456789 |
12345 | ABCDEF |
12345 | HIJKLM |
例如,我想将 ID 12345(上图(的所有帐户放在一行上,使其如下所示。
table.ID | table.ACCOUNT1 | table.ACCOUNT2 | table.ACCOUNT3 |
====================================================================
12345 | 456789 | ABCDEF | HIJKLM |
我想我想将表连接到自己,但我在第二个和第三个帐户字段中不断获得相同的值(即456789出现在所有 3 个字段中(。
如果您实际上不需要为所有帐户使用单独的列,请考虑使用聚合函数,例如 Postgres 中的 string_agg
:
SELECT id, string_agg(account, ',') FROM table GROUP BY id
这将生成一个包含两列的结果,即 id 和一个字符串,其中包含由 ,
个字符分隔的 id 的所有帐户。
如果您知道每个 ID 最多有三个帐户,则可以透视数据。 在大多数数据库中,可以使用row_number()
和条件聚合:
select id,
max(case when seqnum = 1 then account end) as account_1,
max(case when seqnum = 2 then account end) as account_2,
max(case when seqnum = 3 then account end) as account_3
from (select t.*
row_number() over (partition by id order by id) as seqnum
from t
) t
group by id;
与字符串聚合方法不同,这会将值放入单独的列中。