我在表table1中有列a、b和c。我需要一个如下所示的查询:
select func1(a), func2(b,func1(a)) from table1 group by c.我目前正在使用窗口函数将func1(a)的结果存储在CTE中,然后执行上面的group by。执行计划显示发生了两个聚合-一个用于窗口聚合,另一个用于第二个group by的散列聚合。从逻辑上讲,应该可以在单个通道中使用单个聚合来完成此操作。
我使用的是Postgres9.3。我尝试嵌套窗口函数和嵌套聚合函数,但我得到的错误是,两者在Postgres中都不可能实现。
我基本上喜欢上面的聚合是在一个单一的通过。
发布于 2014-05-10 03:09:36
基本上,您使用子查询或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。
https://stackoverflow.com/questions/23571354
复制相似问题