【问题标题】:Accessing aggregate in nested subquery在嵌套子查询中访问聚合
【发布时间】:2017-12-15 18:52:15
【问题描述】:

我有一个带有order_idextended_price 列的order_lines 表。我想知道扩展价格总和高于所有订单扩展价格总和平均值的订单。这是我得到的查询:

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。

【问题讨论】:

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


    【解决方案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 作为平均值,但子查询通常更便宜。

    相关:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多