PostgreSQL,命名为分组集



有没有办法命名分组集?对于每个分组集(根据 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

相关内容

  • 没有找到相关文章

最新更新