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,所以沒有意識到窗口的功能。偉大的方式來聚合聚合。 –