gpt4 book ai didi

sql - 我可以在没有另一个查询的情况下实现嵌套聚合函数的效果吗?

转载 作者:行者123 更新时间:2023-11-29 13:59:34 26 4
gpt4 key购买 nike

我在表 table1 中有列 abc。我需要如下查询:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com