没有其他查询,我可以实现嵌套聚合函数的效果吗?

时间:2014-05-09 18:10:09

标签: sql postgresql group-by window-functions

我在表格a中有bctable1列。我需要一个如下的查询:

select func1(a), func2(b,func1(a)) from table1 group by c.

我目前正在使用窗口函数将func1(a)的结果存储在CTE中,然后执行上述组。执行计划显示2个聚合发生 - 一个用于窗口聚合,另一个用于第二个组的哈希聚合。从逻辑上讲,它可以在一次通过中使用单个聚合来完成。

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

我基本上希望上述聚合一次完成。

1 个答案:

答案 0 :(得分:0)

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

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)

此:

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;

与舍入错误除外:

SELECT sum(a * b) AS f2
FROM   test_table1
GROUP  BY c;

SQL Fiddle证明(非)差异。