在嵌套子查询中访问聚合

时间:2017-07-11 15:44:54

标签: sql postgresql subquery aggregate-functions window-functions

我有一个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来获取用于计算sumtotal的{​​{1}}。但我正在运行与主查询相同的查询,以再次计算avgtotal并与sumtotal进行比较。有没有更好的方法只使用标准的SQL功能。我正在使用PostgreSQL。

1 个答案:

答案 0 :(得分: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作为平均值,但子查询通常更便宜。

相关:

相关问题