4

有没有办法命名分组集?对于每个分组集(根据https://www.postgresql.org/docs/devel/static/queries-table-expressions.html使用汇总或多维数据集显式定义或生成),我想以某种方式指定一个名称结果列。这是我正在尝试做的一个丑陋的即时演示,名称只是分组列的列表:

select *, array_to_string(array_remove(array[case when "A" is null then null else 'A' end,
                                             case when "B" is null then null else 'B' end,
                                             case when "C" is null then null else 'C' end
                                            ],null),',') as grouping_set
from (values  ('a','b','c'),
              ('aa','bb','cc'),
              ('aaa',null,'ccc')) as foo("A","B","C")
group by rollup(1,2,3);


  A  | B  |  C  | grouping_set
-----+----+-----+--------------
 a   | b  | c   | A,B,C
 a   | b  |     | A,B
 a   |    |     | A
 aa  | bb | cc  | A,B,C
 aa  | bb |     | A,B
 aa  |    |     | A
 aaa |    | ccc | A,C   <--------- should be A,B,C
 aaa |    |     | A     <--------- should be A,B
 aaa |    |     | A 
     |    |     |

但请注意,用箭头标记的两行存在问题:这两行都在分组中包含列 B,但在名称中不包含列,因为 B 在这些组中为空。

有什么想法或更好的方法来解决这个问题吗?

4

2 回答 2

7
SELECT "A", "B", "C",
       CASE GROUPING("A", "B", "C")
          WHEN 0 THEN 'A,B,C'
          WHEN 1 THEN 'A,B'
          WHEN 3 THEN 'A'
          ELSE ''
       END AS grouping_set
FROM (VALUES ('a','b','c'),
             ('aa','bb','cc'),
             ('aaa',null,'ccc')
     ) AS foo("A","B","C")
GROUP BY ROLLUP(1,2,3);

根据Clodoaldo Neto的回答,有关分组集的相关文档。

于 2017-01-25T16:13:06.740 回答
4

分组操作

分组操作与分组集(参见第 7.2.4 节)结合使用以区分结果行。GROUPING 操作的参数实际上并未被计算,但它们必须与相关查询级别的 GROUP BY 子句中给出的表达式完全匹配。位被分配,最右边的参数是最低有效位;如果相应的表达式包含在生成结果行的分组集的分组标准中,则每个位为 0,否则为 1。

select *, grouping("A","B","C") as grouping_set
from (values
    ('a','b','c'),
    ('aa','bb','cc'),
    ('aaa',null,'ccc')
) as foo("A","B","C")
group by rollup(1,2,3);
  A  | B  |  C  | grouping_set 
-----+----+-----+--------------
 a   | b  | c   |            0
 a   | b  |     |            1
 a   |    |     |            3
 aa  | bb | cc  |            0
 aa  | bb |     |            1
 aa  |    |     |            3
 aaa |    | ccc |            0
 aaa |    |     |            1
 aaa |    |     |            3
     |    |     |            7
于 2017-01-25T16:14:48.497 回答