首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不需要另一个查询,可以实现嵌套聚合函数的效果?

问不需要另一个查询,可以实现嵌套聚合函数的效果?
EN

Stack Overflow用户
提问于 2014-05-10 02:10:09
回答 1查看 51关注 0票数 1

我在表table1中有列a、b和c。我需要一个如下所示的查询:

代码语言:javascript
复制
select func1(a), func2(b,func1(a)) from table1 group by c.

我目前正在使用窗口函数将func1(a)的结果存储在CTE中,然后执行上面的group by。执行计划显示发生了两个聚合-一个用于窗口聚合,另一个用于第二个group by的散列聚合。从逻辑上讲,应该可以在单个通道中使用单个聚合来完成此操作。

我使用的是Postgres9.3。我尝试嵌套窗口函数和嵌套聚合函数,但我得到的错误是,两者在Postgres中都不可能实现。

我基本上喜欢上面的聚合是在一个单一的通过。

EN

回答 1

Stack Overflow用户

发布于 2014-05-10 03:09:36

基本上,您使用子查询或CTE (就像您已经提到的)来避免重复计算函数:

代码语言:javascript
复制
SELECT c, a1, func2(b,a1) AS ba1
FROM  (SELECT c, func1(a) AS a1, b FROM table1) sub
GROUP  BY c;

SQL文件系统中的示例

你知道吗,当排除整数除法产生的舍入误差时,表达式可以简化为sum(a * b)。

这一点:

代码语言:javascript
复制
with temp_view as (
   select (sum(a * b) over (partition by c) / sum(a) over (partition by c)) as func1_out, a, c
   from   test_table1
   )
select sum(a * func1_out) AS f2
from   temp_view
group  by c;

与相同(除了舍入误差):

代码语言:javascript
复制
SELECT sum(a * b) AS f2
FROM   test_table1
GROUP  BY c;

演示(非)差异的SQL Fiddle。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23571354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档