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

标签 sql postgresql group-by window-functions

我在表 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/

相关文章:

mysql - SQL 查询中 IN 运算符的使用

mysql - 从每个商店的产品价格表中获取产品的最低价格

MYSQL高级排序

c# - 查找名称中包含奇数字符的记录

sql - PostgreSQL Varchar UID 到 Int UID,同时保持唯一性

c# - SQL Server 使用 datetime2 查询今天的日期

ruby-on-rails - Postgres 搜索可以在搜索 2/6/1992 时返回 2-6-1992 的日期

postgresql - 如何在 PostgreSQL 中获取周期间(周开始到周末)?

mysql - 如果日期列位于查询的 SELECT 部分中,为什么我的查询会变慢?

mysql - 如何实现需要一对一连接然后多对多的sql查询?