一切! 我有以下场景: 1.一个非常复杂的SELECT语句。我需要从其结果集中的前n行,使用连接和多个WHERE子句将其称为$ sql。 2.聚合SELECT语句,其中我使用复杂的select语句中的所有结果,如下所示:
SELECT SUM(a), (SELECT DISTINCT....) etc.
目前实现看起来如此,这两个步骤是在perl代码中单独完成的。
然后摘要调用将整个$ sql插入到语句中:
SELECT SUM(foo) AS sum1
FROM A, ($sql) AS B
WHERE A.doc=? AND A.id=B.id
这很贵,$ sql需要<1秒并完成两次。显然我想尽可能避免第二次电话会议。 所以,我想写一个函数,它接受$ sql(动态生成)和要返回的记录数, 返回记录但存储整个结果集以避免再次执行查询。结果集是> 6000行。
然而,由于PL / pgSQL不强,我无法将其视为存储过程。我要创造一个临时工。具有第一步查询结果集的表,并在第二步中使用它?或者更好地在一步中执行选择和摘要并将结果存储在temp中。表?以编程方式我选择了第二个,但我再次需要一个建议。
我非常感谢任何代码草图,以便更好地掌握PL / pgSQL,并了解如何解决这种&#39; SELECT和聚合&#39;一种问题,返回两种价值观。 提前谢谢。
答案 0 :(得分:0)
当聚合函数用作窗口函数时,它会聚合当前行窗口框架内的行。与ORDER BY一起使用的聚合和默认窗口框架定义会产生“运行总和”类型的行为,这可能是也可能不是所需的。要获得整个分区的聚合,请省略ORDER BY或使用ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。其他帧规格可用于获得其他效果。
假设t
是动态查询:
select *
from (
select *,
sum(foo) over () as the_sum,
row_number() over(order by bar) as rn
from t
) s
where rn < 3
;
foo | bar | the_sum | rn
-----+-----+---------+----
1 | a | 6 | 1
2 | b | 6 | 2
t
:
create table t (foo int, bar text);
insert into t (foo, bar) values
(1,'a'),(2,'b'),(3,'c');