热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

PostgreSQL利用用户定制的聚集函数选取每个分组的若干行数据

来源: 作者: 时间:2008-05-23 Tag: 点击:

  • 创建一个聚集函数:
CREATE AGGREGATE int_array_accum ( BASETYPE=_int4,
SFUNC=intarray_push_array, stype=_int4);

这个聚集函数的目的很简单,就是把两个整数数组拼接起来,返回之。具体的文档,可以参考:

http://www.pgsqldb.org/pgsqldoc-8.1c/xaggr.html http://www.pgsqldb.org/pgsqldoc-8.1c/sql-createaggregate.html

和 intarray 的文档:

http://www.pgsqldb.org/mwiki/index.php/Intarray

以及 intagg 模块的文档:

http://www.pgsqldb.org/mwiki/index.php/Intagg

其中用到的拼接函数 intarray_push_array 其实是 intarray 的两个数组相加(+号)的处理函数。可以在intarray的初始化SQL文件 _int.sql 里面找到(在4E的RPM包里是/usr/local/pgsql/share/contrib/_int.sql),

  • 执行下面的查询:
select * from tellers where
( select int_array_accum(a.array) from
(select subarray(int_array_aggregate(tid),0,5) as array from tellers
group by bid) a)
@@ tid::text::query_int;

就会得到期望的输出。这个查询有点意思,我们分解看看:

最内层的:

  select subarray(int_array_aggregate(tid),0,5) as array from tellers group by bid;

我们其实是对每个 bid (连锁店ID),然后调用 int_array_aggregate 聚集函数(见intagg)的文档,把每个 bid 输出的 tid 组合成一个整数数组,int_array_aggregate是intagg模块提供的一个聚集函数,因为group by之后,在SELECT的输出列表里只能出现group by的id和聚集函数,所以这里必须聚集一下。之后用 intarray的subarray取输出的头5个元素。

然后,将上面这个查询的输出,再次用聚集函数拼成一个更大的数组:

  select int_array_accum(a.array) from
  (select subarray(int_array_aggregate(tid),0,5) as array from tellers
  group by bid) a;

因为聚集函数不能嵌套,所以我们用一个子查询骗骗它。然后就得到一个N长的整数数组,里头的所有 ID就是我们需要取出来的ID,于是,最后:

  select * from tellers where
  ( select int_array_accum(a.array) from
  (select subarray(int_array_aggregate(tid),0,5) as array from tellers
  group by bid) a)
  @@ tid::text::query_int;

把所有在这个数组里头的ID行的对应数据都找出来,我们这里用了intarray 的 @@操作符和query_int类型,不过这个其实也可以用ANY和IN等构造,理论上不复杂,大家都可以试试。




相关文章:
pgSQL 集群过程
PL/SQL学习笔记:游标
Pgbouncer 管理员手册
Pgbouncer 用户手册
Pgbouncer 介绍
使用dbi-link在PG里访问异构数据库
PostgreSQL查看数据库表的大小
PostgreSQL设置默认的search path(schema)
PostgreSQL如何让数据按照中文排序
PostgreSQL利用用户定制的聚集函数选取每个分组的
PostgreSQL的FTI与中文全文索引的实践
PostgreSQL 8.3文档-V 服务器编程-扩展SQL-C 语言
在Windows系统上安装和运行PostgreSQL的常见问题
PostgreSQL常见问题
PostgreSQL 简介
Ubuntu系统下安装和配置PostgreSQL 8.1
影响postgresql性能的几个重要参数
PostgreSQL相关
如何从网络上登录其它计算机的PostgreSQL
在Ubuntu和Debian系统下安装PostgreSQL
导入文本文件中存放的数据
从其他机器登陆PostgreSQL
PostgreSQL入门
PostgreSQL 7.2 教程
PostgreSQL 8.0.0入门之创建数据库
postgresql-数据库物理存储
PL/pgSQL的结构
Postgresql-基本语句
PL/pgSQL控制结构
在 Windows 上安装客户端