在子选择中创建聚合,而无需将引用的字段添加到分组列表

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

【讨论】:

以上是关于在子选择中创建聚合,而无需将引用的字段添加到分组列表的主要内容,如果未能解决你的问题,请参考以下文章

分组和求和,使用非聚合标准来确定字段选择

LINQ to Entities - 在分组数据中创建中值

将分组的聚合唯一列添加到熊猫数据框

SqlAlchemy 将新字段添加到类并在表中创建相应的列

Python pandas:使用方法链接将列添加到分组的 DataFrame

将 jQuery JSON 对象保存到 SQL 表中,而无需在 MVC ASP.NET Core 中创建视图模型类