我在表格a
中有b
,c
,table1
列。我需要一个如下的查询:
select func1(a), func2(b,func1(a)) from table1 group by c.
我目前正在使用窗口函数将func1(a)
的结果存储在CTE中,然后执行上述组。执行计划显示2个聚合发生 - 一个用于窗口聚合,另一个用于第二个组的哈希聚合。从逻辑上讲,它可以在一次通过中使用单个聚合来完成。
我正在使用Postgres9.3。我尝试嵌套窗口函数和嵌套聚合函数,但我得到的错误是Postgres都不可能。
我基本上希望上述聚合一次完成。
答案 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;
您是否知道在排除因整数除法而导致的舍入错误时,表达式可以简化为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证明(非)差异。