【问题标题】:PostgreSQL select and aggregatePostgreSQL 选择和聚合
【发布时间】:2016-10-12 21:01:46
【问题描述】:

全部! 我有以下情况: 1. 一个相当复杂的 SELECT 语句。我需要其结果集中的前 n 行,将其称为 $sql 并带有连接和多个 WHERE 子句。 2. 一个聚合 SELECT 语句,我使用了复杂的 select 语句的所有结果,如下所示:

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

目前的实现看起来是这样的,这两个步骤是在 perl 代码中分别完成的。

  1. 首先创建一个游标“DECLARE cur CURSOR WITHOUT 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
    

这很昂贵,$sql 需要 6000 行。

但是,由于 PL/pgSQL 不强,我无法真正将其描绘成一个存储过程。我要创建一个临时文件吗?带有第一个查询的结果集的表并稍后在第二步中使用它?或者更好地一步完成选择和摘要并将结果存储在临时文件中。桌子?以编程方式,我选择了第二个,但同样,我需要对此提出建议。

我也非常感谢任何代码草图,以便更好地掌握 PL/pgSQL 并了解如何解决这种“选择和聚合”类型的问题,返回两种值。 提前谢谢你。

【问题讨论】:

  • 您可以尝试使用SELECT INTO 并创建临时表。

标签: postgresql select stored-procedures sum


【解决方案1】:

查看手册herehere

当聚合函数用作窗口函数时,它聚合当前行窗口框架内的行。与 ORDER BY 和默认窗口框架定义一起使用的聚合会产生“运行总和”类型的行为,这可能是也可能不是想要的。要获得整个分区的聚合,请省略 ORDER BY 或使用 ROWS BETWEEN UNBOUNDED PRECEDING 和 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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2016-11-19
    • 1970-01-01
    • 2018-07-17
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多