有没有办法命名分组集?对于每个分组集(根据 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 在这些组中为 null。
有什么想法或更好的方法吗?
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的回答,有关分组集的相关文档。
分组操作
分组操作与分组集结合使用(参见第 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