我有一个order_lines
表,其中包含order_id
和extended_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。
答案 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作为平均值,但子查询通常更便宜。
相关: