我在表 table1
中有列 a
、b
、c
。我需要如下查询:
select func1(a), func2(b,func1(a)) from table1 group by c.
我目前正在使用窗口函数将 func1(a)
的结果存储在 CTE 中,然后执行上述分组依据。执行计划显示发生了 2 个聚合 - 一个用于窗口聚合,另一个用于第二个分组依据的散列聚合。从逻辑上讲,应该可以在一次传递中使用一次聚合来完成。
我正在使用 Postgres9.3。我尝试了嵌套窗口函数和嵌套聚合函数,但我得到的错误是这两种函数在 Postgres 中都是不可能的。
我基本上希望一次完成上述聚合。
最佳答案
基本上,您使用子查询或 CTE(就像您已经提到的那样)来避免重复计算函数:
SELECT c, a1, func2(b,a1) AS ba1
FROM (SELECT c, func1(a) AS a1, b FROM table1) sub
GROUP BY c;
SQL Fiddle 中的示例
您是否知道在排除因整数除法产生的舍入错误时,表达式可以简化为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展示(非)差异。
关于sql - 我可以在没有另一个查询的情况下实现嵌套聚合函数的效果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23571354/