在嵌套子查询中访问聚合
Accessing aggregate in nested subquery
我有一个 order_lines
table 和 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
来获取用于计算 avgtotal
的 sumtotal
。但是我 运行 与我的主查询相同的查询再次计算 sumtotal
并与 avgtotal
进行比较。有没有更好的方法可以仅使用标准 SQL 功能来做到这一点。我正在使用 PostgreSQL。
一种方法是 运行 在子查询中的聚合函数上使用 window 函数:
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 来计算平均值,但子查询通常更便宜。
相关:
- Postgres window function and group by exception
- Best way to get result count before LIMIT was applied
- PostgreSQL reusing computation result in select query
我有一个 order_lines
table 和 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
来获取用于计算 avgtotal
的 sumtotal
。但是我 运行 与我的主查询相同的查询再次计算 sumtotal
并与 avgtotal
进行比较。有没有更好的方法可以仅使用标准 SQL 功能来做到这一点。我正在使用 PostgreSQL。
一种方法是 运行 在子查询中的聚合函数上使用 window 函数:
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 来计算平均值,但子查询通常更便宜。
相关:
- Postgres window function and group by exception
- Best way to get result count before LIMIT was applied
- PostgreSQL reusing computation result in select query