首页 > 解决方案 > 查询将分组行中的某些列映射到同一行中的多个列的表

问题描述

我正在使用 postgres,我有一个如下所示的表:

f_id1 f_id2 f_id3 f_id4 value
 1      1    1     1    'aaa'
 1      1    1     2    'bbb'
 2      1    1     1    'ccc'
 2      1    1     2    'ddd'
 1      2    1     1    'eee'
 1      2    1     2    'fff'
 1      1    2     1    'ggg'
 1      1    2     2    'hhhh'
 2      2    1     1    'iii'
 2      2    1     2    'jjj'

我想查询这个表,结果是每个唯一的 f_id1、f_id2、f_id3 组合都有一行,每个 f_id4 是该行中具有 value 值的列。

所以对于这张表,我希望我的输出是

f_id1 f_id2 f_id3 f_id4_1 f_id4_2
1      1     1     'aaa'   'bbb'
2      1     1     'ccc'   'ddd'
1      2     1     'eee'   'fff'
1      1     2     'ggg'   'hhh'
2      2     1     'iii'   'jjj'

我们可以假设我们事先知道所有可能的 f_id4 值(在本例 1 和 2 中)。

我们还可以假设我们事先知道所有可能的 f_id1、f_id2 和 f_id3 值(在示例中也只有 1 和 2)。

标签: sqlpostgresql

解决方案


您需要条件聚合。这可以使用FILTER子句来完成,例如:

演示:db<>小提琴

SELECT
    f_id1,
    f_id2,
    f_id3,
    MAX(value) FILTER (WHERE f_id4 = 1) as f_id4_1,
    MAX(value) FILTER (WHERE f_id4 = 2) as f_id4_2
FROM
    mytable
GROUP BY 1,2,3

推荐阅读