【发布时间】:2014-09-17 16:45:48
【问题描述】:
我有一个 PostgreSQL 表构造为
a | b | c
-----+-----+-----
3 | 2 | 1
1 | 5 | 1
8 | 4 | 1
2 | 5 | 1
4 | 4 | 2
2 | 5 | 2
9 | 3 | 2
3 | 5 | 3
2 | 5 | 3
4 | 4 | 3
5 | 6 | 3
9 | 7 | 3
我想为c 的每个值计算a 的平均值,其中b 低于给定值——例如b 的平均值。
这是我的查询:
SELECT avg(a) FROM mytable t WHERE b<(SELECT avg(b) FROM mytable WHERE c=t.c) GROUP BY c;
我实际上有两个问题,但我相信它们都属于这个问题(第一个问题实际上允许我更新标题):
这种查询是否有特定的名称或表达式(我的意思是,主查询中的子选择和重新集成操作,或类似的东西)?我什至找不到如何在线搜索解决方案... => 好的,窗口函数。
这个查询很慢,如何优化?我使用的是 9.3.5,
b已经按数字顺序排序。
谢谢。
更新:编辑 user17130 的答案 was rejected,但这个答案不会从头开始工作,所以这里是工作代码:
explain select
avg(a)
from
(
select
avg(b) over (partition by c) as b_avg,
a,
b,
c
from mytable
) as t
where b<b_avg
group by c;
QUERY PLAN
------------------------------------------------------------------------------------
GroupAggregate (cost=135.34..202.46 rows=67 width=8)
Subquery Scan on t (cost=135.34..198.39 rows=647 width=8)
Filter: ((t.b)::numeric < t.b_avg)
-> WindowAgg (cost=135.34..169.29 rows=1940 width=12)
-> Sort (cost=135.34..140.19 rows=1940 width=12)
Sort Key: mytable.c
-> Seq Scan on mytable (cost=0.00..29.40 rows=1940 width=12)
【问题讨论】:
-
查看窗口函数和 HAVING 子句。
-
搜索正确的术语确实要容易得多,谢谢!我会相应地更新问题。
-
发布解释分析(首选使用 explain.depesz.com)。 “非常慢”有点太模糊了。
标签: postgresql query-optimization window-functions