我将PostgreSQL用于Web应用程序,并且遇到了一种我无法想到有效编写方式的查询。
我要做的是从表中选择所有行,当按特定方式分组时,该组符合某些条件。例如,构建此查询的天真方式可能是这样的:
SELECT *
FROM table T
JOIN (
SELECT iT.a, iT.b, SUM(iT.c) AS sum
FROM table iT
GROUP BY iT.a, iT.b
) TG ON (TG.a = T.a AND TG.b = T.b)
WHERE TG.sum > 100;
我遇到的问题是,这有效地加倍查询执行所需的时间,因为它实际上是从该表中选择两次行。
如何有效地构建此类型的查询?
答案 0 :(得分:1)
你可以尝试窗口功能,虽然我不知道它是否更有效。我想这是因为它避免了加入。使用explain
select *
from (
select
a, b,
sum(c) over(partition by a, b) as sum
from t
) s
where "sum" > 100