postgresql 按组和子组进行聚合,结果显示在一列中

bhmjp9jg  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(230)

我有一个表,其中包含组、子组以及子组的子组。我想按总和进行聚合,如下所示:

grp,   sub_group, sub_sub_group, sum
grp-A,                           10
       sub-A,                     6
                  sub_sub_A       3
                  sub_sub_B       3
       sub-B,                     4
                  sub_sub_A       4

所以grp-A的和是从sub-Asub-B(6+4)得到的,这是它们各自的子群之和。我如何用PostgreSQL实现这一点?

fdbelqdn

fdbelqdn1#

这里的关键问题是sum列对于不同的行有不同的含义。当然,各种含义是相关的,但还不足以使查询特别清晰。我能想到的最好的方法是通过自己的查询执行每个级别的聚合,组合结果集,然后将它们按所需的顺序排序。这是一种可能的方法:

with fine_agg as (
  select grp, sub_group, sub_sub_group, sum(datum) as datum
  from base_table
  group by grp, sub_group, sub_sub_group
), mid_agg as (
  select grp, sub_group, NULL as sub_sub_group, sum(datum) as datum
  from fine_agg
  group by grp, sub_group
), coarse_agg as (
  select grp, NULL as sub_group, NULL as sub_sub_group, sum(datum) as datum
  from mid_agg
  group by grp
), all_agg as (
  select * from fine_agg
  union all
  select * from mid_agg
  union all
  select * from all_agg
)
select grp, sub_group, sub_sub_group, datum as "sum"
from all_agg
order by grp, sub_group nulls first, sub_sub_group nulls first

如果您不关心行的顺序,那么您可以使用联合查询作为顶级查询,展开其中的一个级别。
请注意,如果base_table.sub_groupbase_table.sub_sub_group包含任何空值,则结果将不明确。

相关问题