在子选择中创建聚合,而无需将引用的字段添加到分组列表
Posted
技术标签:
【中文标题】在子选择中创建聚合,而无需将引用的字段添加到分组列表【英文标题】:create aggregates inside a subselect without having to add referenced fields to the group by list 【发布时间】:2013-12-20 18:16:18 【问题描述】:我想对我的数据进行嵌套分组/聚合,但我希望将输出展平,以便我只获得外部组将生成的行
这是 2 级嵌套组输出通常的样子:
+-----------+-----------+---------------+
|outer_group|inner_group|aggregate_value|
+-----------+-----------+---------------+
| 8|dist_yes | 191.0|
| 8|dist_no | 83.0|
| 9|dist_yes | 135.0|
| 9|dist_no | 89.0|
+-----------+-----------+---------------+
但我想要的是三列,第一列用于外部组,第二列称为“dist_no”,用于聚合“dist_no”,第三列称为“dist_yes”,用于聚合“dist_yes”
会有两行,outer_group vals 为 8、9,dist_no vals 为 83、89,dist_yes vals 为 191、135
我尝试在 select 语句中使用子查询,并将 dist_yes_no 字段从 group by 列表中取出,但子查询需要引用 dist_yes_no 字段,这意味着它必须在 group by 列表中(至少与我正在使用的 H2),我又回到了我开始的地方
想法?谢谢
【问题讨论】:
你能展示样本数据和预期的输出吗?这通常比描述你所追求的更容易理解。 这对于窗口函数应该是可行的(我认为 IBM 称它们为“olap”函数) 【参考方案1】:这样的东西会有帮助吗?
select a.outer_group, a.aggr_dist_no, b.aggr_dist_yes from
(select outer_group,
sum(value) as aggr_dist_no,
null as aggr_dist_yes
where inner_group = dist_no
group by outer_group) a
join
(select outer_group,
null as aggr_dist_no,
sum(value) as aggr_dist_yes
where inner_group = dist_yes
group by outer_group) b
on a.outer_group = b.outer_group
【讨论】:
以上是关于在子选择中创建聚合,而无需将引用的字段添加到分组列表的主要内容,如果未能解决你的问题,请参考以下文章