2016-06-12 75 views
0

所有! 我有以下情况: 1.一个非常复杂的SELECT语句。我需要结果集中的前n行,使用连接和多个WHERE子句将其称为$ sql。 2.如果我使用所有从复杂的select语句,它看起来像结果的聚集SELECT语句:PostgreSQL选择和聚合

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

目前实行看起来那么,这两个步骤是在Perl代码分开进行。

  1. 第一光标置于“DECLARE CUR CURSOR无持有$ SQL”
  2. ,则前n命中被取出
  3. 然后汇总电话打进来插了整个$ 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中不强,我不能真正把它描绘成一个存储过程。我应该创建一个临时表与第一查询的结果集并在第二步中稍后使用它?或者最好在一步中完成选择和总结,并将结果存储在临时文件中。表?以编程方式我选择了第二,但我需要一个建议。

我也非常感谢任何代码草图,以便更好地掌握PL/pgSQL,并了解如何解决这种“SELECT和聚合”类问题,返回两种值。 预先感谢您。

+0

您可以尝试使用'选择INTO'和创建临时表。 – Adam

回答

0

检查手册herehere

当集合函数被用作窗口函数,它聚合在当前行的窗框内的行。与ORDER BY一起使用的集合以及默认的窗口框架定义会产生一个“运行总和”行为类型,这可能是也可能不是需要的。要获得整个分区的聚合,可以省略ORDER BY或在无界前接和后接之间使用ROWS。其他框架规格可用于获得其他效果。

假设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');