PostgreSQL选择和聚合

时间:2016-06-12 09:53:36

标签: postgresql select stored-procedures sum

一切! 我有以下场景: 1.一个非常复杂的SELECT语句。我需要从其结果集中的前n行,使用连接和多个WHERE子句将其称为$ sql。 2.聚合SELECT语句,其中我使用复杂的select语句中的所有结果,如下所示:

SELECT SUM(a), (SELECT DISTINCT....) etc.

目前实现看起来如此,这两个步骤是在perl代码中单独完成的。

  1. 首先制作光标" DECLARE cur CURSOR WITH FOR HOLD FOR $ sql'
  2. 然后获取前n个命中。
  3. 然后摘要调用将整个$ sql插入到语句中:

    SELECT SUM(foo) AS sum1 
    FROM A, ($sql) AS B
    WHERE A.doc=? AND A.id=B.id
    
  4. 这很贵,$ sql需要<1秒并完成两次。显然我想尽可能避免第二次电话会议。 所以,我想写一个函数,它接受$ sql(动态生成)和要返回的记录数, 返回记录但存储整个结果集以避免再次执行查询。结果集是> 6000行。

    然而,由于PL / pgSQL不强,我无法将其视为存储过程。我要创造一个临时工。具有第一步查询结果集的表,并在第二步中使用它?或者更好地在一步中执行选择和摘要并将结果存储在temp中。表?以编程方式我选择了第二个,但我再次需要一个建议。

    我非常感谢任何代码草图,以便更好地掌握PL / pgSQL,并了解如何解决这种&#39; SELECT和聚合&#39;一种问题,返回两种价值观。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

查看手册herehere

  

当聚合函数用作窗口函数时,它会聚合当前行窗口框架内的行。与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');