1

我有一个order_lines表,其中有order_idextended_price列。我想知道所有订单的延期价格总和高于平均价格的订单。这是我得到的查询:在嵌套子查询中访问聚合

SELECT order_id, SUM(extended_price) AS "sumtotal" 
FROM order_lines e 
GROUP BY order_id 
HAVING SUM(extended_price) > 
    (SELECT AVG(c.sumtotal) AS "avgtotal" 
    FROM 
    (SELECT order_id, SUM(extended_price) AS "sumtotal" 
    FROM order_lines 
    GROUP BY order_id) c 
) 
ORDER BY sumtotal  

正如我们可以看到我有一个子查询c来得到被用来计算avgtotalsumtotal。但是我运行的查询与我的主查询相同,以再次计算sumtotal并与avgtotal进行比较。有没有更好的方法来使用标准的SQL功能呢?我正在使用PostgreSQL。

回答

1

一种方法是在一个子查询碾过聚合函数窗函数:

SELECT order_id, sumtotal 
FROM (
    SELECT order_id 
     , SUM(extended_price) AS sumtotal 
     , AVG(SUM(extended_price)) OVER() AS avgtotal 
    FROM order_lines 
    GROUP BY order_id 
    ) sub 
WHERE sumtotal > avgtotal; 

应该会更快。

或者使用CTE来避免重复评估。不过,它为中期结果的实现增加了一些成本。

WITH cte AS (
    SELECT order_id, SUM(extended_price) AS sumtotal 
    FROM order_lines 
    GROUP BY order_id 
    ) 
SELECT order_id, sumtotal 
FROM cte 
WHERE sumtotal > (SELECT avg(sumtotal) FROM cte); 

为清晰起见,您可能会使用另一个CTE作为平均值,但子查询通常更便宜。

相关:

+0

谢谢!我现在很少玩SQL,所以没有意识到窗口的功能。伟大的方式来聚合聚合。 –